小编Kar*_*kar的帖子

使用 Hilt 预填充房间数据库

我正在尝试使用 RoomDatabase.Callback() 方法用数据预填充 Room 数据库,并且也成功做到了这一点。后来我尝试对 Hilt 进行同样的操作,但无法弄清楚如何在 hilt 模块中提供数据库时添加回调。

这是数据库模块:

@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {

    @Singleton
    @Provides
    fun provideDatabase(
        @ApplicationContext context: Context
    ): PersonDatabase {
        return Room.databaseBuilder(
            context,
            PersonDatabase::class.java,
            "person_database"
        ).build()

    }

    @Singleton
    @Provides
    fun provideDao(database: PersonDatabase) = database.personDao()

}
Run Code Online (Sandbox Code Playgroud)

这是回调类:


class PersonCallback @Inject constructor(
    private val dao: PersonDao
) : RoomDatabase.Callback() {

    private val applicationScope = CoroutineScope(SupervisorJob())

    override fun onCreate(db: SupportSQLiteDatabase) {
        super.onCreate(db)
        applicationScope.launch(Dispatchers.IO) {
            populateDatabase()
        }
    }

    private suspend fun populateDatabase() {
        val person = Person("FirstName", "LastName", 20) …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-room

6
推荐指数
1
解决办法
1115
查看次数

从 Firebase 检索数据时出现协程流错误

这是我第一次尝试使用 MVVM 架构模式通过 Firebase 实现 Flow。这里的问题是当我按下加载按钮时数据加载到文本视图中。但是,当我上传新数据并尝试获取新数据和旧数据时,它不起作用,它只显示旧数据。重新启动应用程序后,它会提供新数据。下面是代码。

存储库

@ExperimentalCoroutinesApi
class PostsRepository {

    private val mPostsCollection =
        FirebaseFirestore.getInstance().collection(Constants.COLLECTION_POST)

    fun getAllPosts() = flow<State<List<Post>>> {

        emit(State.loading())

        val snapshot = mPostsCollection.get().await()
        val posts = snapshot.toObjects((Post::class.java))

        emit(State.success(posts))

    }.catch {
        emit(State.failed(it.message.toString()))
    }.flowOn(Dispatchers.IO)


    fun addPosts(post: Post) = flow<State<DocumentReference>>
    {
        emit(State.loading())

        val postref = mPostsCollection.add(post).await()

        emit(State.success(postref))

    }.catch {
        emit(State.failed(it.message.toString()))
    }.flowOn(Dispatchers.IO)


}
Run Code Online (Sandbox Code Playgroud)

国家级

sealed class State<T> {
    class Loading<T> : State<T>()
    data class Success<T>(val data: T) : State<T>()
    data class Failed<T>(val message: String) : State<T>()

    companion object {
        fun <T> …
Run Code Online (Sandbox Code Playgroud)

android firebase google-cloud-firestore kotlin-coroutines

2
推荐指数
1
解决办法
1744
查看次数

在 Android 中使用 Kotlin 获取回调

我是 Kotlin 的新手,想学习 Lambda 函数。我已经学习 Android 几个月了。并且想要集成 Kotlin 和 Andriod ,因此为了练习,我尝试将 Java 代码转换为 Kotlin。我在收到回电时遇到麻烦。下面的代码需要一个我无法实现的回调。

我没有提到ReservoirPutCallback接口是用Java编码的并且处于只读模式

这是我的代码(Java),我在其中遇到错误:-

        if(DISK_CACHE_INITIALIZED){
            Reservoir.putAsync(Constants.SCIENTISTS_CACHE_KEY, scientists,
             **new ReservoirPutCallback()** {
                @Override
                public void onSuccess() {
                    //success
                    DISK_CACHE_DIRTY = false;
                }
                @Override
                public void onFailure(Exception e) {
                    Log.e("CAMPOSHA","PUTTING CACHE TO DISK FAILED");
                }
            });
        }
    }

    public static LiveData<List<Scientist>> bindFromDiskCacheAsync(){
        MutableLiveData<List<Scientist>> scientistLiveData=new MutableLiveData<>();
        if(!DISK_CACHE_INITIALIZED){
            return null;
        }
        **Type resultType = new TypeToken<List<Scientist>>() {}.getType()**;
        Reservoir.getAsync(Constants.SCIENTISTS_CACHE_KEY, resultType,
         new ReservoirGetCallback<List<Scientist>>() {
            @Override
            public void onSuccess(List<Scientist> scientists) {
                scientistLiveData.setValue(scientists);
            }
            @Override
            public void …
Run Code Online (Sandbox Code Playgroud)

android kotlin

1
推荐指数
1
解决办法
3148
查看次数