使用Room Library时,数据库中的数据始终返回Empty Array

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Room Library时,数据库中的数据始终返回Empty Array相关的知识,希望对你有一定的参考价值。

我想问一下我的代码。我在数据库中插入数据时没有显示错误,但是当我尝试getAll时,我只得到空数组。我不知道哪里出错了。我希望有人可以帮我解决这个问题。

这是我第一次使用房间图书馆。

这是我的Dao界面:

@Dao
interface SampleDao {
@Query("SELECT * from Sample")
fun getAll():Single<List<Sample>>

@Insert
fun insertSampel(sample:Sample)

这是我的singletonDB:

@Database (entities = [Sample::class], version = 1)
abstract class SingletonDB : RoomDatabase() {
abstract fun sampleDao():SampleDao

companion object {
    private var INSTANCE:SingletonDB? = null

    fun getInstance(context: Context):SingletonDB?{
        if (INSTANCE == null){
            synchronized(SingletonDB::class){
                INSTANCE = Room.databaseBuilder(context.applicationContext,
                        SingletonDB::class.java, "db")
                        .build()
            }
        }
        return INSTANCE!!
    }

    fun destroyInstance() {
        INSTANCE = null
    }

}

这是房间数据库中的getAllData方法:

  override fun getAll() {
    mDB.sampleDao().getAll()
            .subscribeOn(Schedulers.io())
            .observeOn(androidSchedulers.mainThread())
            .subscribe(object : SingleObserver<List<Sample>> {
                override fun onSuccess(t: List<Sample>) {
                    Log.i(TAG, t.toString())
                }

                override fun onSubscribe(d: Disposable) {

                }

                override fun onError(e: Throwable) {
                    Log.i(TAG, e.message)
                }
            })
}

此代码用于在数据库中插入数据:

override fun insertSampel(id: Int, name: String, age: Int) {
    val sample = Sample(id, name, age)
    Completable.fromAction {
        Thread {
            Runnable {
                mDB.sampleDao().insertSampel(sample)
            }
        }
    }.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io()).subscribe(
                    object : CompletableObserver {
                        override fun onComplete() {
                            Log.i(TAG, "Complete")
                        }

                        override fun onSubscribe(d: Disposable) {

                        }

                        override fun onError(e: Throwable) {
                            Log.i(TAG, e.message)
                        }
                    }
            )
}
答案

你调试了问题的根源吗?

在认为错误是INSERT(get)之前,你应该检查你的QUERY是否正常工作

由于您已经使用Rx,请尝试将插入代码更改为:

val sample = Sample(id, name, age)

Completable.fromAction(() -> mDB.sampleDao()
                .insertSampel(sample)) // By the way there's a typo here :)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()) // If you want to observe
                .subscribe(/* Handle the result and/or error */);

以上是关于使用Room Library时,数据库中的数据始终返回Empty Array的主要内容,如果未能解决你的问题,请参考以下文章

Room Persistence Library:迁移过程中的奇怪错误

从 SQLite 迁移到 Android Room Persistence Library

查看使用 Room Persistence Library 创建的数据库的内容

调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常

如何使用 Android Room Persistence Library 将 Column 注释为 NOT NULL

Room 中的数据库自动迁移功能