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

时间:2019-02-02 13:57:04

标签: java android callback android-room

创建RoomDatabase对象以在回调内部使用(如本示例中的BasicSample的第83和88行)之间有什么区别

然后

像在第71行的android-room-with-a-view示例中一样,在回调内部使用RoomDatabase的成员变量吗?

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

我不知道为什么没有答案

1 个答案:

答案 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;
}