java - 在回调中创建 Room Database 实例或使用该数据库的成员变量

标签 java android callback android-room

创建一个 RoomDatabase 对象以在回调中使用有什么区别,就像在这个 BasicSample 的例子中一样在第 83 和 88 行,

还有,

在回调中使用 RoomDatabase 的成员变量,就像这个 android-room-with-a-view 的例子一样在第 71 行?

我不是征求意见,我是问这两个例子之间是否有区别或好处?

不知道为什么没人回答

最佳答案

简而言之

简而言之,这两个代码非常相似。他们检查成员变量的值。如果该值已经存在,则只需返回该值而不创建新对象。否则,如果变量的值为空,则创建一个新对象,将对象赋值给成员变量,然后返回值。

长期

您提到的两个代码都只是为了实现 Singleton Pattern .有多种方法可以实现这一点:

android-architecture-components repository

AppDatabase database = AppDatabase.getInstance(appContext, executors);

在上面的代码中,我们调用了getInstance(.. , ..) 方法,它通过以下方式实现单例模式:

public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
    synchronized (AppDatabase.class) {
        if (sInstance == null) {
            sInstance = buildDatabase(context.getApplicationContext(), executors);
            sInstance.updateDatabaseCreated(context.getApplicationContext());
        }
    }
}
   return sInstance;
}

getInstance() 方法并不总是创建新对象。相反,它检查成员变量 sInstance 的值。如果该值为 null,则为其分配 DB 对象的值,然后返回该值。如果该值不为空,则只需返回已存储的值,即先前 DB 对象的值。

android-room-with-a-view repository

它也做同样的事情,即使用相同的单例值 INSTANCE 并将其传递给 AsyncTask 的新对象

new PopulateDbAsync(INSTANCE).execute();

单例模式

static WordRoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (WordRoomDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        WordRoomDatabase.class, "word_database")
                        // Wipes and rebuilds instead of migrating if no Migration object.
                        // Migration is not part of this codelab.
                        .fallbackToDestructiveMigration()
                        .addCallback(sRoomDatabaseCallback)
                        .build();
            }
        }
    }
    return INSTANCE;
} 

关于java - 在回调中创建 Room Database 实例或使用该数据库的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493736/

相关文章:

android - Mapbox Android SDK : Add makers using symbolManager

android - 默认选择为空的微调器

javascript - 有没有一种方法可以编写 JavaScript,使其在处理许多回调时更具可读性?

java - 使用 JTextPane 和 HTMLEditorKit 显示 HTML 图像

java - OOP 航空公司预订

android - PorterDuffColorFilter 更改我的 recyclerview 中的所有图标

javascript - dialog.showMessageBox 不返回 Electron main.js 中的按钮索引

java - 创建不同对象的实例列表

java - bubbleSort 和 swap 方法不起作用 [Java]

javascript - Vue 通过 props 和 "this"回调