从android中提取Sqlite数据库会产生空数据库
我正在开发一个使用Sqlite的移动应用程序,我想从手机中提取.db文件,并在Sqlite的db浏览器中查看它 问题来自这样一个事实:当我运行adb命令时,我得到的.db文件是空的,即使我已经创建了表并向数据库中的这些表添加了数据 在应用程序中,我查询数据库中插入的记录,并返回它们。有什么想法吗 adb命令:从android中提取Sqlite数据库会产生空数据库,android,sqlite,nativescript,Android,Sqlite,Nativescript,我正在开发一个使用Sqlite的移动应用程序,我想从手机中提取.db文件,并在Sqlite的db浏览器中查看它 问题来自这样一个事实:当我运行adb命令时,我得到的.db文件是空的,即使我已经创建了表并向数据库中的这些表添加了数据 在应用程序中,我查询数据库中插入的记录,并返回它们。有什么想法吗 adb命令:adb exec out作为projectname cat数据库运行/my.db>my.db 数据库创建代码: if(!Sqlite.exists("my.db")){ ne
adb exec out作为projectname cat数据库运行/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.log("succcess")
db.execSQL("INSERT INTO Times (clockIn, clockOut) VALUES (?, ?)", ["Nic", "Raboy"]).then(() => {
db.all("SELECT * FROM Times").then((rows) => {
console.log(rows)
})
})
},
(error) => {
console.log('Error occurred creating table');
});
},
(error) => {
console.log("Error creating Database");
});
}
我想出了解决这个问题的办法。在Android9上,使用adb拉取时必须包含-wal和-shm文件。然后,当打开.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
您必须使用
appDatabase.close()
才能使用它
关闭活动的
onStop()
中的db后,从Android Studio中的Android设备文件资源管理器中提取db文件,并使用任何Broswer sqlite查看器查看其中的表。在我的项目中,如果(!sqlite.exists(“my.db”)它不会干扰我现有的数据库,我没有。删除此行对您有用吗?我相信新的Sqlite('my.db')将读取数据库(如果存在),并将其引用交给您。您的设备上的操作系统版本是什么?@shawnparar否,运行adb后数据库仍然为空command@ManojAndroid版本9。我正在使用一个模拟器,如果这有什么不同的话。那么它应该可以工作,也许你想尝试一下中的替代命令。你还应该能够通过Android Studio中的设备管理器下载数据库(如果你正在使用的话)。您可以导航到您的设备(可以是模拟器AVD)并搜索应用程序的data/data/[database]文件夹。另一种方法是确保使用完全检查数据库。在这种情况下,-shm和-wal文件将是空的,并且不是必需的。它在Android 9上出现是因为Android 9的默认设置是使用WAL,而不是SQLite默认的日志模式。谢谢,这帮了大忙