Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
#1

Как работать с файлом .db? - Программирование Android

14.12.2015, 16:17. Просмотров 1348. Ответов 14
Метки нет (Все метки)

У меня есть права рут на телефоне. Я копировал файл .db приложения из data/data на SD Card и как я теперь могу программно прочитать содержимое этого файла??Обычно через Cursor или как?? Я просто знаю как при помощи SQLiteOpenHelper создать базу данных SQLite и через Cursor в приложении ее прочитать. Так вот а если есть просто файл db приложения(доступ к нему есть), данные там не в зашифрованном виде и я хочу в своем приложении открыть и прочитать этот файл. Что для этого нужно делать ?? Как открыть для чтения этот db файл(какую функцию использовать) и как потом прочитать данные. Можете подсказать идею?? И как можно вообще открыть db файл, чтобы посмотреть что там есть?? Какой просмотрщик для этого использовать??
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2015, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работать с файлом .db? (Программирование Android):

Dimens как работать? - Программирование Android
как создать какой нибудь Dimens, чтоб на всех экранах корректно отображалось. Существует ли в андроид студии какой нибудь инструмент для...

Как работать с таймером - Программирование Android
как ребят пользоваться таймером в андройде , у меня стек должен ждать данных как приходят они то он показывает как реализовать таймер что...

SlidingMenu как работать - Программирование Android
сделал меня разобрался, скажите как обрабатывать то пункты меню как при выборе загружать нужную активность я пробую через интент но...

Как работать с API VK / Facebook? - Программирование Android
Добрый день, хочу сделать приложение про универ, в общем разобрался как что делать но есть несколько вопросов, так как я в этом деле...

Объясните как работать с сортировкой - Программирование Android
Ну есть у меня класс Note: public class Note { String name; public Note(String _name) { name = _name;} public...

Как правильно работать с BITMAP? - Программирование Android
задача менять цвет картинки которая стоит в фоне у EditText; ну почитал, посмотрел ... везде работают с ImageView/// как мне...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
17.12.2015, 00:18 #2
yura91, Если ты знаешь как работать с БД в Android, то попробуй сделать следующее:
- Создай класс для работы с БД, но т.к. ты не создаешь БД, а используешь уже существующую, то в этом классе опиши метод который будет копировать БД из папки Assets твоего приложения в папку где приложение хранит бд, а дальше открывай её и читай.
- Если ты хочешь просто ее прочитать, то скопируй БД на ПК и открой с помощью SqliteBrowser
Думаю понятно объяснил
0
dajver
408 / 272 / 18
Регистрация: 18.09.2010
Сообщений: 1,111
17.12.2015, 01:42 #3
Нашел на просторах, должно работать. Тольно не бездумно вставляйте и говорите что не работает, а подставьте везде свое название файла, расширение и package неймы.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
 
    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    /*private String DB_PATH = "/data/data/"
                        + mycontext.getApplicationContext().getPackageName()
                        + "/databases/";*/
 
    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }
 
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }   
 
    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }
 
    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);
 
        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;
 
        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases   /(datbasename).sqlite");
 
        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }
 
        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }
 
    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }
 
    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
 
}
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
17.12.2015, 18:17  [ТС] #4
но т.к. ты не создаешь БД, а используешь уже существующую, то в этом классе опиши метод который будет копировать БД из папки Assets твоего приложения в папку где приложение хранит бд
Ну так БД сохраняется в раздел data/data причем сдесь папка Assets?? А как тогда копировать БД из папки Assets??
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
17.12.2015, 18:41 #5
yura91, Я так понял у тебя есть файл .db откуда ты его взял я незнаю, и ты хочешь его открыть в своем приложение. Поэтому я говорю скопируй к себе в приложение

вот код который я использовал

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            //Путь к новой БД
            String outFileName = DB_PATH + DB_NAME;
            File file = new File(outFileName);
            if (!file.exists()) {
                this.getReadableDatabase();
                //получаем локальную бд как поток
                inputStream = context.getAssets().open(DB_NAME);
                //Открываем пустую БД
                outputStream = new FileOutputStream(outFileName);
                // по байтово копируем данные
                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }
                outputStream.flush();
                outputStream.close();
                inputStream.close();
            }
            return true;
        } catch (IOException e) {
            return false;
        }
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
17.12.2015, 18:54  [ТС] #6
В этом файле db хранится база данных другого приложения, например Skype. Путь к этому db - data/data и тд. Вы имеете ввиду скопировать этот файл db в папку assets, читать оттуда и записать в то место где у меня db хранится моего приложения(в data/data/mypackagename) и работать с ним через assets в своем приложении правильно я понял?? Но я же не обязательно в assets я могу его и на sd карту скопировать и работать с ним оттуда разве нет??
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
19.12.2015, 13:00 #7
yura91, да можете, но что бы работать с ним вы должны его скопировать в папку с БД своего приложения
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
23.12.2015, 15:24  [ТС] #8
Но папка db моего приложения находится в data/data.То есть я должен скопировать db файл, например скайпа в data/data где находится db моего приложения и потом только могу с ним работать верно?? Сделать это нужно программно как показано в примере выше так я понял правильно? И дальше можно программно подключится и открыть этот db файл стороннего приложения так?
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
23.12.2015, 15:24 #9
yura91, Верно
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
23.12.2015, 15:47  [ТС] #10
а дальше когда подключился к db как прочитать содержимое файла, например прочитать переписку из полей этого db, если это скайп ?? Обычно через Cursor или как то еще??
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
23.12.2015, 15:48 #11
yura91, Пишешь SQL запрос, он тебе возвращает cursor, а ты бегай по курсору.
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
23.12.2015, 16:46  [ТС] #12
Типа query() и тд стандартные функции да? А если структура db файла сложная, то бывает что через курсор его поля сложно получить??

Добавлено через 1 минуту
Как вообще рассмотреть структуру db файла как находятся поля и такого типа?? Там могут быть смещения в полях от начала еще что нибудь, что усложняет чтение да??
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
23.12.2015, 18:34 #13
yura91, Можно посмотреть скачав её на ПК и открыв через SqliteBrowser, где посмотришь что там лежит и как лежит. Да конечно, сложно достать то, что не знаешь как лежит.
0
yura91
30 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,278
23.12.2015, 19:00  [ТС] #14
а можно как то задать при записи данных в базу данных расположение колонок относительно друг друга или смещение данных относительно начальной позиции в db файле?? Есть какие нибудь манипуляции со смещениями да?
0
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
23.12.2015, 19:02 #15
yura91, Это я не знаю, я слабо знаком с SQL, но возможно можно что то подобное сделать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2015, 19:02
Привет! Вот еще темы с ответами:

Как работать с файловым менеджером - Программирование Android
Не могли бы вы привести пример, как осуществить выбор файла через стандартный файловый менеджер? Буду очень благодарен, если отправите...

Как заставить работать BroadcastReceiver? - Программирование Android
Добрый день! Собственно идея: есть стандартный плеер телефона(HTC One m7 Android 4.4.3) и проводная гарнитура с одной кнопкой. Но по...

как работать с xml-файлом? - Delphi
Задача заключается в следующем: как из xml-файла, выдернуть данные (с помощью какого свойства, метода, а лучше на примере "времени и даты")...

как работать с файлом мс прожект - Delphi
Всем привет! Есть ли какая то литература? или подскажите что нибудь


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.12.2015, 19:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru