Извлечение базы данных Sqlite из Android дает пустую базу данных

Я разрабатываю мобильное приложение, использующее Sqlite, и я хотел бы извлечь файл .db с телефона и просмотреть его в браузере БД для Sqlite.

Проблема возникает из-за того, что когда я запускаю команды adb, файл .db, который я получаю, пуст, хотя у меня есть таблицы creatd и добавленные данные в эти таблицы в базе данных.

В приложении я запрашиваю базу данных для вставленных записей, и они возвращаются. Есть предположения?

команда adb: adb exec-out run-as projectname cat databases/my.db > my.db

код создания бд:

if (!Sqlite.exists("my.db")){
        new Sqlite("my.db")
        .then(
            (db) => {
            //create table here
                db.execSQL("CREATE TABLE IF NOT EXISTS Times (Id INTEGER PRIMARY KEY AUTOINCREMENT, clockIn TEXT, clockOut TEXT)")
                .then(
                    () => {
                        console.info("succcess")
                        db.execSQL("INSERT INTO Times (clockIn, clockOut) VALUES (?, ?)", ["Nic", "Raboy"]).then(() => {
                            db.all("SELECT * FROM Times").then((rows) => {
                                console.info(rows)
                            })
                        })

                    }, 
                    (error) => { 
                        console.info('Error occurred creating table');
                    });
        },
            (error) => {
                console.info("Error creating Database");
            });
    }    

В моем проекте у меня нет if (!Sqlite.exists("my.db")), и это не мешает моей существующей базе данных. Удаление этой строки работает для вас? Я считаю, что новый Sqlite('my.db') прочитает базу данных, если она существует, и передаст вам ссылку на нее.

Shawn Pacarar 10.05.2019 19:30

Какая версия ОС на вашем устройстве?

Manoj 10.05.2019 20:26

@ShawnPacarar Нет, база данных все еще пуста после запуска команды adb.

cvb 10.05.2019 20:27

@Manoj Android версии 9. Я использую эмулятор, если это имеет значение.

cvb 10.05.2019 20:29

Тогда он должен работать, может быть, вы захотите попробовать альтернативные команды в эта ТАК нить

Manoj 10.05.2019 20:31

@Manoj Я пробовал большинство, если не все из них. Тот же результат. Я получаю файл .db, но в моей базе данных нет таблиц или записей.

cvb 10.05.2019 20:44

Тогда может быть альтернатива — скопировать и поделиться им программно.

Manoj 10.05.2019 20:45

@Manoj Я смог понять это и добавил в качестве ответа. Похоже, это было специфично для Android 9. Спасибо за помощь.

cvb 10.05.2019 21:01
4
8
1 613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я понял, как решить эту проблему. На Android 9 вы должны включать файлы -wal и -shm при извлечении с помощью adb. Затем, когда файл .db будет открыт, вы увидите свою базу данных в том виде, в каком вы ее построили, а не пустой скелет базы данных.

Это может быть не лучший способ сделать это, но он будет работать:

adb exec-out run-as projectname cat databases/my.db > my.db
adb exec-out run-as projectname cat databases/my.db-shm > my.db-shm
adb exec-out run-as projectname cat databases/my.db-wal > my.db-wal

Вы также должны иметь возможность загрузить базу данных через диспетчер устройств в Android Studio (если это то, что вы используете). Вы переходите к своему устройству (которое может быть симулятором AVD) и выполняете поиск в папке data/data/[database] вашего приложения.

Michael Dougan 10.05.2019 21:39

Альтернативой является обеспечение полной контрольной точки базы данных с помощью см. схему PRAGMA.wal_checkpoint;. В этом случае файлы -shm и -wal будут пустыми и не нужны. Это выясняется на Android 9, потому что с Android 9 по умолчанию используется WAL, а не режим журнала по умолчанию SQLite.

MikeT 10.05.2019 23:43

Вы должны использовать appDatabase.close(), чтобы это работало.

После закрытия базы данных в onStop() своей активности извлеките файл базы данных из проводника Android-устройства в Android Studio и используйте любое средство просмотра Broswer sqlite для просмотра таблиц в нем.

Другие вопросы по теме