- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用 Dagger 2 在我的应用中根据需要创建和共享我的 RoomDatabase。
我正在尝试实现 addCallback()
以便我可以覆盖数据库的 onCreate()
函数并使用它来插入我的初始数据库值。这就是我遇到问题的地方。
我觉得我必须忽略一些显而易见的事情,但我想不出一种优雅的方法。
RoomDatabase 类:
@Database(
entities = [Station::class],
version = 1,
exportSchema = false
)
abstract class TrainDB : RoomDatabase() {
abstract fun stationDao() : StationDao
}
DAO:
@Dao
abstract class StationDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(stations: Station)
@Query("SELECT * FROM station_table")
abstract fun getAll() : LiveData<List<Station>>
}
Dagger 模块:
@Module
class DataModule {
@Singleton
@Provides
fun provideDb(app: Application): TrainDB {
var trainDB: TrainDB? = null
trainDB = Room
.databaseBuilder(app, TrainDB::class.java, "train.db")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
/*
WHAT GOES HERE?
*/
}
})
.build()
return trainDB
}
@Singleton
@Provides
fun providesStationDao(db: TrainDB) : StationDao = db.stationDao()
}
我希望能够在 onCreate()
回调中访问我的 DAO。很明显这应该是可能的,因为 Google 正在将 Room 和 Dagger 放在一起,这可能是一个非常常见的用例。
我尝试将 DAO 作为 provideDB()
的构造函数参数提供,但这会产生循环依赖
我尝试将我的 RoomDatabase 初始化为伴随对象。然后在我的 provideDB()
方法中使用 Room.builder
格式,我可以调用一个 getInstance()
方法来访问道。但是这样我遇到了递归调用 getWriteableDatabase()
的错误。
我知道我可以使用 db.execSQL()
之类的东西,但是当我使用 Room 时这样做似乎太可惜了。
我错过了更好的方法吗?我正在使用 Kotlin,但欢迎使用 Java 示例。 :)
最佳答案
我是这样管理的:
@Module
class DataModule {
lateinit var trainDB: TrainDB
@Singleton
@Provides
fun provideDb(app: Application): TrainDB {
trainDB = Room
.databaseBuilder(app, TrainDB::class.java, "train.db")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
/*
trainDB.stationDao().insert(...)
*/
}
})
.build()
return trainDB
}
@Singleton
@Provides
fun providesStationDao(db: TrainDB) : StationDao = db.stationDao()
}
但请记住,您需要从数据库中进行虚假读取以启动数据库并调用 onCreate()。当 db 尚未创建时,不要在第一次交互时写入 db,因为它会产生竞争条件,并且您的 on create 写入不会生效。
关于android - 通过 Dagger 2 提供 RoomDatabase 时实现 .addCallback() 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520840/
我想尝试 Room Persistence 库,但是在使用 gradle 添加和下载它之后,我可以找到大多数类,除了: import android.arch.persistence.room.Dat
我正在尝试在我的应用程序中设置房间(按照文档)。除了我的 Database 类外,一切都编译得很好。找不到 RoomDatabase 类。可能值得注意的是,我使用的是 Jetpack Compose
如何为我的应用程序 VACUUM 我的 RoomDatabase?我围绕 Room 构建了我的整个应用程序,在某个时候,一张大 table 经常被删除,然后又被填满。 我试图用查询创建一个额外的 DA
在 Android RoomDatabase 上,我想在将对象插入数据库时执行一个操作并获取已保存数据的 ID。在 Kotlin 我有这段代码: @Insert(onConflict = OnCo
我正在尝试测试以下 LocalDataSource 函数, NameLocalData.methodThatFreezes 功能,但它卡住。我该如何解决这个问题?或者我该如何以另一种方式对其进行测试?
我有一个巨大的数据库,是用 SQLiteOpenHelper 编写的。现在我们开始在我们的项目中实现 Room。所以,我的问题是:如何处理迁移问题? 例如,我在 MySQLiteOpenHelper
我正在为一些 friend 开发一个记录个人信息的Android App。我有一个带有一个表“记录”的模拟数据库。它具有三个主要栏目:_date、小时和分钟。 我已经测试了这个查询,它在 MySQL
我正在使用一个应用程序的 Java 代码库在 Kotlin 中构建另一个应用程序。我写了一个类 AppDatabase 扩展 RoomDatabase 是一个单例。它工作一次,其他时候不调用该类。这是
在 Android 示例代码/codelabs 中,RoomDatabase 中的 Daos 被定义为 abstract fun genericDao(): GenericDao 当你需要访问dao的
我在 Android 上使用 Room 持久性库。目前,每次访问数据库时我都有一些额外的同步代码。我想知道是否需要此代码。 我目前以单例访问数据库。这就是我目前将对象插入数据库的方式: //
我正在尝试在我的 Android 应用程序中使用 RoomDatabase。我正在使用 LiveData 来自动刷新 fragment 中的更改。 我第一次运行我的应用程序时,我从 API 获取数据,
我的问题是如何存储 List 在房间数据库中,到目前为止,我找不到答案。 最佳答案 枚举: public enum HelloEnum { A, B, C } 转换器: pub
我们尝试使用以下代码更新 sqlite_sequence。 WeNoteRoomDatabase weNoteRoomDatabase = WeNoteRoomDatabase.instance();
当我尝试构建我的应用时,我收到了这个编译错误: Supertypes of the following classes cannot be resolved. Please make sure you
当我构建这段代码时,它显示构建错误: DatabaseManager_Impl is not abstract and does not override abstract method clearA
我使用 Room Persisdent lib 创建了 MovieDatabase。根据 RoomDatabase.Callback 中 onCreate() 方法的文档,onCreate() 在第一
我正在学习使用 Android Studio,并且通常遵循在线教程来开发一个简单的应用程序,该应用程序使用 Room 等架构进行数据库访问和管理。我已经编写了 Entity 和 Dao 文件,但是在数
我正在使用 Dagger 2 在我的应用中根据需要创建和共享我的 RoomDatabase。 我正在尝试实现 addCallback() 以便我可以覆盖数据库的 onCreate() 函数并使用它来插
所以我正在尝试在个人项目中使用 Room。我已经实现了我的实体、dao 和我的 roomdatabase 扩展应用程序类: @Database( version = 1, entities = [
Error:Could not resolve all files for configuration ':app:debugAnnotationProcessorClasspath'. Could
我是一名优秀的程序员,十分优秀!