我正在尝试使用 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) 这是我第一次尝试使用 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) 我是 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)