房间里的回调不应该删除这段代码中的所有数据库吗?

问题描述

我刚刚遵循了本指南:https://developer.android.com/codelabs/android-room-with-a-view#12

(不仅是第 12 页,而是从 1 到 17 页)。

在该链接上,它显示了以下代码

private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {
    @Override
    public void onCreate(@NonNull SupportsqliteDatabase db) {
        super.onCreate(db);

        // If you want to keep data through app restarts,// comment out the following block
        databaseWriteExecutor.execute(() -> {
            // Populate the database in the background.
            // If you want to start with more words,just add them.
            WordDao dao = INSTANCE.wordDao();
            dao.deleteall();

            Word word = new Word("Hello");
            dao.insert(word);
            word = new Word("World");
            dao.insert(word);
        });
    }
};

这是 RoomDatabse 类的链接https://github.com/googlecodelabs/android-room-with-a-view/blob/master/app/src/main/java/com/example/android/roomwordssample/WordRoomDatabase.java

由于回调内部有 dao.deletaAll() 函数,它删除所有 sql 数据。在代码中它说“如果您想通过应用程序重新启动保留数据,请注释掉以下代码块”作为注释。

所以当我关闭并重新启动应用程序时,我添加的词应该被删除,我应该只看到“Hello”和“World”。但是当我关闭并重新启动应用程序时,我添加的词仍然存在。我对应用的工作方式有什么误解吗?

为什么我没有注释掉代码,但应用程序重启后数据仍然存在?

解决方法

onCreate 在数据库的生命周期内仅被调用一次。即只有在数据库不存在需要创建时才会调用。

如果您卸载该应用程序然后运行该应用程序,则将调用 onCreate,因为随后将删除数据库。

也许您想覆盖 onOpen 方法而不是 onCreate 方法。