从android拉取Sqlite数据库给出空数据库

Col*_*ren 4 sqlite android nativescript

我正在开发一个使用 Sqlite 的移动应用程序,我想从手机中提取 .db 文件并在 Sqlite 的数据库浏览器中查看它。

问题来自这样一个事实,即当我运行 adb 命令时,我得到的 .db 文件是空的,即使我已经创建了表并将数据添加到数据库中的这些表中。

在应用程序中,我查询数据库中插入的记录并返回它们。有什么想法吗?

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.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");
            });
    }    
Run Code Online (Sandbox Code Playgroud)

Col*_*ren 8

我想出了如何解决这个问题。在 android 9 上,使用 adb 进行拉取时必须包含 -wal 和 -shm 文件。然后当 .db 文件打开时,您将看到您构建的数据库,而不是一个空的骨架 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
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是使用 [参见 PRAGMA schema.wal_checkpoint;](https://www.sqlite.org/pragma.html#pragma_wal_checkpoint) 确保数据库完全检查点。在这种情况下, -shm 和 -wal 文件将为空且不需要。它在 Android 9 上很明显,因为从 Android 9 开始,默认情况下是使用 WAL,而不是 SQLite 默认的日志模式。 (2认同)