我正在使用room persistence library保存一些数据。我需要从两个不同的地方访问数据(比方说活动)。但是在这两种活动中我得到的结果都不一样。
如果我在活动 A 中运行INSERT
,在活动 A 中运行SELECT *
,则可以看到插入的内容。如果我在活动 B 中运行SELECT *
,则看不到我在活动 A 中插入的内容。活动 B 也是如此:如果我在活动 B 中运行INSERT
,在活动 B 中运行SELECT *
,我可以看到我插入的内容。如果我在活动 A 中运行SELECT *
,则看不到我在活动 B 中插入的内容。
我正在使用单例模式来创建数据库实例:
@Database(entities = [SharedFile::class], version = 3)
@TypeConverters(SharedFileTypesConverter::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun sharedFileDao(): SharedFileDao
companion object {
private var INSTANCE: AppDatabase? = null
const val DB_NAME = "db-name.db"
fun getInstance(context: Context): AppDatabase? {
(if (INSTANCE == null) "null" else "not null").logDebug() // Prints null the first time and then not null every other time - so thats seems to work nice
if (INSTANCE == null) {
synchronized(AppDatabase::class) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
DB_NAME
)
.fallbackToDestructiveMigration()
.build()
}
}
return INSTANCE
}
fun destroyInstance() {
INSTANCE = null
}
}
}
在两个活动 A 和 B 中:
getDatabasePath(AppDatabase.DB_NAME).logDebug() // Returns the same path in both activities
AppDatabase.getInstance(context)?.sharedFileDao()?.getAll() // Returns different results for each activity
我迷路了。我想不出为什么它不起作用的原因。起初,我认为可能是由于上下文的原因,这就是为什么我记录数据库路径的原因,但是在两种情况下都是相同的……而且单例似乎也很好。
如果两个活动都使用同一实例,那么它们如何返回不同的结果?
编辑:已解决
getDatabasePath()
返回不同的值。打印值时我犯了一个错误。