与房间访问Android中的SQLite数据的问题。 MVVM架构。 Livedata
以下代码是Android的Kotlin中基于MVVM架构的房间实现。
我对数据库的预先填充有问题。我的数据库没有任何数据,也找不到获取或插入数据的解决方案。
IDE不会提出任何汇编问题。
我认为问题是在ViewModel中,但我处于死胡同。
编辑:我看过DB,人口稠密。插入很好,但不是读取的数据。我将尝试修改ViewModel及其关联的 livedata
和 mutableLive
数据。
这是我的数据类:
@Entity(tableName = Constants.DATABASE_NAME)
data class Card(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = Constants.COLUMN_NAME_ID) val id: Int?,
@ColumnInfo(name = Constants.COLUMN_NAME_FAV) val fav: Boolean,
@ColumnInfo(name = Constants.COLUMN_NAME_DATE) val date: Date,
@ColumnInfo(name = Constants.COLUMN_NAME_RAW_VALUE) val rawValue: String,
@ColumnInfo(name = Constants.COLUMN_NAME_STORE_TYPE) val storeType: String,
@ColumnInfo(name = Constants.COLUMN_NAME_STORE_NAME) val storeName: String,
@ColumnInfo(name = Constants.COLUMN_NAME_STORE_NOTES) val storeNotes: String
)
这是我的接口dao
@Insert
suspend fun insertNewCard(card: Card) {
}
@Delete
suspend fun deleteCard(card: Card)
@Query("SELECT * FROM ${Constants.DATABASE_NAME}")
fun getAllCards(): LiveData<List<Card>>
- 更新: 这是我的数据库类
@Database(
entities = [Card::class],
version = 1,
exportSchema = true,
//autoMigrations = [AutoMigration (from = 1, to = 2)]
)
@TypeConverters(Converters::class)
abstract class CardsDatabase : RoomDatabase() {
abstract fun cardsDao(): CardsDao
private class CardsDatabaseCallback(private val scope: CoroutineScope)
: RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
INSTANCE?.let { database ->
scope.launch {
populateDatabase(database.cardsDao())
}
}
}
suspend fun populateDatabase(cardsDao: CardsDao) {
val testCard = Card(null,
false,
((Calendar.getInstance()).time),
"test",
"codebar test 1",
"Prueba tienda",
"Esta es una tienda de prueba"
)
val testCardTwo = Card(null,
false,
((Calendar.getInstance()).time),
"barcode test 2",
"codebar",
"Prueba tienda 2",
"Esta es una segunda prueba de tienda"
)
Log.d("ROOM", "$testCard")
cardsDao.insertNewCard(testCard)
}
}
companion object {
@Volatile
private var INSTANCE: CardsDatabase? = null
fun getDatabase(context: Context, scope: CoroutineScope): CardsDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
CardsDatabase::class.java,
Constants.DATABASE_NAME)
.addCallback(CardsDatabaseCallback(scope))
.build()
INSTANCE = instance
instance
}
}
}
这是存储库类
val allCards: LiveData<List<Card>> = cardsDao.getAllCards()
@Suppress("RedundantSuspendModifier")
@WorkerThread
suspend fun insertCard(card: Card) {
cardsDao.insertNewCard(card)
}
suspend fun deleteCard(card: Card) {
cardsDao.deleteCard(card)
}
这是我的ViewModel:
LogCat在这一点上显示为Null livedata。
private val _allCards = MutableLiveData<List<Card>>()
val allCards : LiveData<List<Card>> = _allCards
init {
getAllCards()
Log.d("ROOM", "${allCards.value}")
}
private fun getAllCards() = viewModelScope.launch {
_allCards.value = cardRepository.allCards.value
Log.d("ROOM", "_ : ${_allCards.value}")
}
fun insertCard(card: Card) = viewModelScope.launch {
cardRepository.insertCard(card)
Log.d("ROOM", "inserted: $card")
}
}
class CardsViewModelFactory(private val repository: CardRepository) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(CardsViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return CardsViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
这是应用程序类别:
private val applicationScope = CoroutineScope(SupervisorJob())
private val database by lazy { CardsDatabase.getDatabase(this, applicationScope) }
val repository by lazy { CardRepository(database.cardsDao()) }
最后,在主动行动中观察到:
cardsViewModel.allCards.observe(this) { cards ->
cards?.let { adapter.setData(it) }
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的版本。
它可以与
classPath'org.jetbrains.kotlin:Kotlin-Gradle-Plugin:1.6.21'
添加到
build> build.gradle
:创建
entity.class:
创建
dao.class
创建
database.class
:对于工作,您应该使用Singleton
Test
testDatabase.class
:My version.
It works with
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
add to
build.gradle
:create
Entity.class:
create
Dao.class
create
Database.class
:for work you should to use singleton
test
TestDatabase.class
:问题是在Dao中创建的Livedata。要修复它:
已解决。
The problem is the LiveData created in DAO. To fix it:
Solved.