提问人:mamad zd 提问时间:11/6/2023 最后编辑:mamad zd 更新时间:11/6/2023 访问量:61
RoomDatabase Insert 不起作用,没有错误可以找到原因
RoomDatabase Insert doesnt work and no error to find why
问:
我正在使用房间数据库 当我插入数据时,我无法再次读取它 而且我不知道问题出在哪里,因为SQL没有错误
问题是问题是什么,SQL是如何发挥作用的
实体
@Entity(tableName = "boards_table")
class BoardModel {
@PrimaryKey
var Id = ""
var Title =""
}
id 不是自动增加,因为它已经创建,我正在阅读一个 API
道
@Dao
interface BoardDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun addBoard(board:BoardModel)
@Query("SELECT * FROM boards_table")
fun readAllData(): LiveData<List<BoardModel>>
@Query("DELETE FROM boards_table")
suspend fun deleteAllBoard()
@Delete
suspend fun deleteBoard(board:BoardModel)
}
写入活动
private lateinit var boardDao:BoardDAO
appDb = NimaDatabase.getDatabase(this)
// tempBoardlist from api and it is OK
for (board in tempBoardlist){
GlobalScope.launch {
boardDao.addBoard(board.toBoardModel())
}
}
读入活动
var boardlist = boardDao.readAllData().value
我使用了@Throws(SQLException::class)但没有工作
// this works fine
// class to get from API easily
class board() {
val _id: String = ""
val title: String = ""
}
//Covert it to BoardModel
fun board.toBoardModel() : BoardModel
{
val b = BoardModel()
b.Id = _id
b.Title = title
return b
}
答:
0赞
Hanif Shaikh
11/6/2023
#1
fun board.toBoardModel() : BoardModel
{
val b = BoardModel()
b.Title = title
return b
}
试试这个
评论
0赞
mamad zd
11/6/2023
不行,为什么不通过ID?对象通过 UNIQE ID 来自 API,需要存储
1赞
Mohamed Shasho
11/6/2023
#2
每个 Room 实体都必须有权访问它,您可以通过将其设为公共或为其提供 getter 和 setter 方法来确保 Room 有权访问该字段。
请阅读房间定义数据
您需要定义 to 有权访问 setter 和 getter 方法。data class
@Entity(tableName = "boards_table")
data class BoardModel(
@PrimaryKey
val id : Long,
val title : String
)
在 Activity 中,建议使用 activity lifecycleScope 启动协程。 阅读将 Kotlin 协程与生命周期感知组件配合使用
lifecycleScope.launch {
// for loop must be in coroutine scope
for(data in list) boardDao.insert(data)
}
这将返回var boardlist = boardDao.readAllData().value
null
LiveData 是一个可观察的数据持有者。您需要注册为观察员。
在活动中:
// Create the observer which updates the UI.
val nameObserver = Observer<List<BoardModel>> { list ->
// Update the UI Hire.
if(list != null) // update list, recyclerview, etc...
}
lifecycleScope.launch {
boardDao.readAllData().observe(this@MainActivity,nameObserver)
}
评论
0赞
mamad zd
11/6/2023
插入现在可以了,如何在 Observer 中更新 myBoardList,myBoardList 是 liveData<list<BoardModel>>
0赞
Mohamed Shasho
11/6/2023
伟大。通常,LiveData 仅在房间数据发生更改时提供更新,并且仅向活跃的观察者提供更新。当您在 Room 中插入、更新和删除时,Observer 中的 myBoardList 将自动观察一个新列表。
0赞
mamad zd
11/7/2023
观察者多次调用,如果结果列表大小为 10,则会调用 10 次!
0赞
Mohamed Shasho
11/7/2023
如果您在 Fragment 中观察,请使用 代替 .viewLifecycleOwner
this@MainActivity
0赞
Mohamed Shasho
11/7/2023
也尝试添加distinctUntilChangedlive.distinctUntilChanged().observe(...)
评论