创建RoomDatabase对象以在回调内部使用(如本示例中的BasicSample的第83和88行)之间有什么区别
然后
像在第71行的android-room-with-a-view示例中一样,在回调内部使用RoomDatabase的成员变量吗?
我不是要征求意见,而是要问两个例子之间是否有区别或好处?
我不知道为什么没有答案
答案 0 :(得分:0)
穿着短裤
简而言之,两个代码完全相同。他们检查成员变量的值。如果该值已经存在,则只需返回该值而不创建新对象。否则,如果variable的值为null,则在这种情况下,请创建一个新对象,将该对象分配给成员变量,然后返回该值。
长期
您提到的代码都是为了实现Singleton Pattern。有多种方法可以实现此目的:
android-architecture-components存储库
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
,请为其分配数据库对象的值,然后返回该值。并且如果该值不为null,则只需返回已存储的值,即先前DB对象的值即可。
android-room-with-a-view存储库
它也做同样的事情,即使用相同的单例值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;
}