gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:06:29 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com