Я разрабатываю мобильное приложение, использующее 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");
});
}
Какая версия ОС на вашем устройстве?
@ShawnPacarar Нет, база данных все еще пуста после запуска команды adb.
@Manoj Android версии 9. Я использую эмулятор, если это имеет значение.
Тогда он должен работать, может быть, вы захотите попробовать альтернативные команды в эта ТАК нить
@Manoj Я пробовал большинство, если не все из них. Тот же результат. Я получаю файл .db, но в моей базе данных нет таблиц или записей.
Тогда может быть альтернатива — скопировать и поделиться им программно.
@Manoj Я смог понять это и добавил в качестве ответа. Похоже, это было специфично для Android 9. Спасибо за помощь.
Я понял, как решить эту проблему. На 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] вашего приложения.
Альтернативой является обеспечение полной контрольной точки базы данных с помощью см. схему PRAGMA.wal_checkpoint;. В этом случае файлы -shm и -wal будут пустыми и не нужны. Это выясняется на Android 9, потому что с Android 9 по умолчанию используется WAL, а не режим журнала по умолчанию SQLite.
Вы должны использовать appDatabase.close(), чтобы это работало.
После закрытия базы данных в onStop() своей активности извлеките файл базы данных из проводника Android-устройства в Android Studio и используйте любое средство просмотра Broswer sqlite для просмотра таблиц в нем.
В моем проекте у меня нет
if (!Sqlite.exists("my.db")), и это не мешает моей существующей базе данных. Удаление этой строки работает для вас? Я считаю, что новый Sqlite('my.db') прочитает базу данных, если она существует, и передаст вам ссылку на нее.