使用Room插入本地数据库无效-Android

问题描述

当我从API提取数据(有效)时,我想将其插入DB,由于某种原因,它不起作用。我正在使用Room库。 (使用Koin DI库)

这是我的代码:

用于从API提取数据的服务:

class PlayerServiceImplFb : PlayerService {

override fun fetchAllPlayers(): Observable<List<PlayerFb>> {
    return Observable.create<List<PlayerFb>> {
        val ref = FirebaseDatabase.getInstance().getReference("/players")
        val matchList : MutableList<PlayerFb> = mutableListOf()
        ref.addListenerForSingleValueEvent(object: ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }

            override fun onDataChange(snapshot: DataSnapshot) {
                val children = snapshot.children
                children.forEach {
                    Log.d("PlayerServiceImpl","Added player ${it.getValue(PlayerFb::class.java)} to list")
                    matchList.add(it.getValue(PlayerFb::class.java)!!)
                }
                it.onNext(matchList)
                it.onComplete()
            }
        })
    }
}

}

DAO:

@Dao
abstract class PlayerDao {

//DELETE ALL AND INSERT PLAYERS
@Transaction
open fun deleteAndInsertAll(entities: List<PlayerEntity>) {
    deleteAll()
    insertAll(entities).blockingAwait()
}

@Insert( onConflict = OnConflictStrategy.REPLACE )
abstract fun insertAll(entities: List<PlayerEntity>): Completable

@Query("DELETE FROM players")
abstract fun deleteAll()

//GET ALL PLAYERS
@Query("SELECT * FROM players")
abstract fun getAll(): Observable<List<PlayerEntity>>
}

存储库(通过Koin DI使用服务和上面的dao):

class PlayerRepoImpl (
private val remoteDataSource: PlayerService,private val localDataSource: PlayerDao
): PlayerRepo {

override fun fetchAllPlayers(): Observable<List<PlayerUI>> {
    return remoteDataSource
        .fetchAllPlayers()
        .doOnNext {
            it.forEach {
                Log.d("PlayerRepoImpl",it.username)
            }
            Log.d("PlayerRepoImpl","Pokusaj upisa u bazu")
            val entities = it.map {
                PlayerEntity (
                    it.id,it.username,it.email,it.profileImage,it.universes
                )
            }
localDataSource.deleteAndInsertAll(entities)
        }
        .map {
            //koristi Resource ovde
            it.map {
                PlayerUI(it.id,it.universes)
            }
        }
}
}

ViewModel层:

class PlayerViewModel (
private val playerRepo: PlayerRepo
) : ViewModel(),PlayerContract.ViewModel {

private val subscriptions = CompositeDisposable()

override val playerStates: MutableLiveData<PlayerState> = MutableLiveData()

override fun fetchAllPlayers() {
    val subscription = playerRepo
        .fetchAllPlayers()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            {
                Log.d("PlayerViewModel","Fetched all players from firebase")
                it.forEach {
                    Log.d("PlayerViewModel",it.username)
                }
                playerStates.value = PlayerState.Success(it)
            },{
                Log.d("PlayerViewModel","error")
            }
        )
    subscriptions.add(subscription)
}
}

每次我都会收到第二个错误lambda:打印出“ PlayerViewModel”,“错误”。但是如果我注释掉 Repository中的localDataSource.deleteAndInsertAll(entities),它工作正常。 在这个上浪费了很多时间...我很绝望。谢谢。

数据库模型:

@Entity(tableName = "players")
data class PlayerEntity (
    @PrimaryKey val id: String,val username: String,val email: String,val profileImage: String,val universes: List<String>
)

API响应模型:

data class PlayerFb (
    val id: String,//kopka me da li mi treba
    val username: String,//kopka me da li mi treba
    val profileImage: String,val universes: List<String>
) {
    constructor() : this("","",listOf())
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)