gpt4 book ai didi

Android Room - 避免将 Context 传递给 Singleton

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

我正在尝试将一个项目迁移到 Android Room。阅读 Android Room 文档后,我注意到 Singleton 适合访问我的数据库。

引自 Android 开发者:

Note: If your app runs in a single process, you should follow the singleton design pattern when instantiating an AppDatabase object. Each RoomDatabase instance is fairly expensive, and you rarely need access to multiple instances within a single process.

我写了下面这段代码:

@Database(entities = {Category.class, News.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

private static final String DB_NAME = "database.db";
private static AppDatabase instance;

public abstract CategoryDao categoryDao();
public abstract NewsDao newsDao();

private AppDatabase () {}

public static AppDatabase getInstance(Context context) {
if (instance == null) {
synchronized (AppDatabase.class) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, DB_NAME).build();
}
}
}
return instance;
}
}

只是一个简单的双重检查锁定单例。

我已经阅读了一些指南/教程,几乎每个人都采用了类似的方法,但是我发现这种方法存在一些问题:

  • 每次都需要传递一个Context,甚至只需要一次来初始化Singleton。
  • 如果我需要在没有可用的 Context 的情况下访问数据库怎么办?
  • 甚至可以向单例发送参数?

有什么想法可以实现解决这些问题的房间数据库单例吗?

如果可能的话,我想避免像 Dagger2 这样的 DI 库。

最佳答案

您可以像这样初始化您的数据库并将其实例保存在您的应用程序类中。

public class MyApplication extends Application {

public AppDatabase database;

@Override
public void onCreate() {
super.onCreate();

database = AppDatabase.getInstance(this)
}
}

稍后,您可以使用以下方式访问您的引用:

((MyApplication)activity).database

希望这会有所帮助。

关于Android Room - 避免将 Context 传递给 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53654053/

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