创建一个 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/