如何从房间数据库kotlin中获取数据

Posted

技术标签:

【中文标题】如何从房间数据库kotlin中获取数据【英文标题】:how to fetch data from room Database kotlin 【发布时间】:2022-01-22 15:44:47 【问题描述】:

我是 RoomDatabse 的新手。我必须在离线模式下从 Room 数据库中获取数据。 这是代码

json

[
 "id": 1,
  "name": "Hero",
  "image": "https://upload.wikimedia.org/wikipedia/commons/4/41/Sunflower_from_Silesia2.jpg",
  "age": "23"
]

这是模型

class Actor() : ArrayList<ActorItem>()
@Entity(tableName = "actor",indices = arrayOf(Index(value= arrayOf("id"),unique = true)))
data class ActorItem(

    @PrimaryKey(autoGenerate = true)
    val id_:Int,
    @SerializedName("age")
    @ColumnInfo(name = "age")
    val age: String,
    @SerializedName("id")
    @ColumnInfo(name = "id")
    val id: Int,
    @SerializedName("image")
    @ColumnInfo(name="image")
    val image: String,
    @SerializedName("name")
    @ColumnInfo(name = "name")
    val name: String
)

存储库类


class ReposetoryHelper(
    private val actorApi: ActorApi,
    private val databaseHelper: DatabaseHelper,
    private val applicationContext: Context)

    private val actorData = MutableLiveData<Actor>()
    val actors : LiveData<Actor>
    get() = actorData

    suspend fun getActor()
        if(NetworkUtil.isInternetAvailable(applicationContext))
            //fatch data from API while Online
            val result_ = actorApi.getActor()
            if (result_.body()!=null)
                databaseHelper.actorDao().addActor(result_.body()!!)
                actorData.postValue(result_.body())
            
        else
                //fatch data from Database while Offline
            
        
    

道类

@Dao
interface ActorDao 

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun addActor(actorItem: List<ActorItem>)

    @Query("SELECT * FROM actor")
    suspend fun getActor():List<ActorItem>

所以当与网络连接时,数据来自 API。但是现在我在失去连接时如何从数据库中获取数据。

【问题讨论】:

在其他部分你可以写actorData.postValue(databaseHelper.actorDao().getActor())这是你问的吗?还是在网络断开时想要一个监听器? 我和你写的一样,但它说需要 Actor,但找到了 ActorList 请同时附上您看到的错误。附上截图或发布错误 如果我没记错的话,问题出在 Rest API 响应中。 类型不匹配。要求:演员!找到:列表 【参考方案1】:

请这样使用:

@Query("SELECT * FROM ActorItem")
suspend fun getActor():List<ActorItem>

使用 ActorItem 表作为模型

actorData.postValue(databaseHelper.actorDao().getActor()) 那么您将不会收到类型不匹配错误。

【讨论】:

【参考方案2】:

你可以试试这个方法

@Query("SELECT * FROM actor")
fun getActor():LiveData<List<ActorItem>>

那你可以试试

 actorDao.getActor().observe(this, Observer<List<ActorItem>>() 
            @Override
            public void onChanged(List<ActorItem> actorItemList) 

            
        )

【讨论】:

以上是关于如何从房间数据库kotlin中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin - 如何执行 onCompleteListener 从 Firestore 获取数据?

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

如何使用Kotlin从Firestore中的数组字段中获取数据?

如何在 Android Studio 中使用 Kotlin 从 Firestore 数据库中获取下一条和上一条数据?

从 Firebase android kotlin 获取数据时如何显示加载的项目

如何从firebase Android kotlin获取基于userId的数据?