RoomDatabase Insert 不起作用,没有错误可以找到原因

RoomDatabase Insert doesnt work and no error to find why

提问人:mamad zd 提问时间:11/6/2023 最后编辑:mamad zd 更新时间:11/6/2023 访问量:61

问:

我正在使用房间数据库 当我插入数据时,我无法再次读取它 而且我不知道问题出在哪里,因为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
}
android kotlin 异常 插入 android-room

评论

0赞 Hanif Shaikh 11/6/2023
您能否将代码放在您创建插入数据模型的位置。
0赞 mamad zd 11/6/2023
@HanifShaikh我没有使用viewModel和存储库
0赞 Hanif Shaikh 11/6/2023
不,我问你在哪里创建插入数据的模型,我想看看
0赞 Hanif Shaikh 11/6/2023
我也想看看 toBoardModel 这个
0赞 mamad zd 11/6/2023
@HanifShaikh 更新

答:

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().valuenull

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 中观察,请使用 代替 .viewLifecycleOwnerthis@MainActivity
0赞 Mohamed Shasho 11/7/2023
也尝试添加distinctUntilChangedlive.distinctUntilChanged().observe(...)