房间实时数据不正确



我的DAO中有这个查询

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertFolders(folderList: List<Folder>)
@Query("select * from attachments_folders where companyId = :companyId")
fun getFoldersByCompanyId(companyId: Int): LiveData<List<Folder>>

我有这个视图模型

class FolderViewModel :ViewModel(){
private val folders: MutableLiveData<List<Folder>> by lazy {
MutableLiveData<List<Folder>>().also {
loadFolders()
}
}
fun getFolders(): LiveData<List<Folder>> {
return folders
}
private fun loadFolders() {
FolderDao().getFoldersByCompanyId(Prefs.getInt(PreferenceKeys.COMPANY_ID, 0))
}

}

然后在我的活动中

FolderViewModel model = ViewModelProviders.of(this).get(FolderViewModel.class);
model.getFolders().observe(this, new Observer<List<Folder>>() {
@Override public void onChanged(@Nullable List<Folder> folders) {
if(folders != null) {
if (folders.size() != 0) {
Fragment companyFragment = AttachmentsListFragmentFactory.newFolderAttachmentsFragment(new ArrayList<>(folders), getJobId());
ft.replace(android.R.id.content, companyFragment);
currentFragment = companyFragment;
} else {
Fragment companyFragment = AttachmentsListFragmentFactory.newCompanyAttachmentsFragment(false, getJobId());
ft.replace(android.R.id.content, companyFragment);
currentFragment = companyFragment;
}
}
}
});

它不断击中其他块。数据库中有 3 个文件夹。所以我不明白为什么这样做,如果有办法纠正这个问题,因为如果数据库中有文件夹,它应该使用 if 片段而不是 else 片段。

插入文件夹

FolderDao().insertFolders(
Gson().fromJson<List<Folder>>(JsonHelper.getArraylistFromJson(response.body()?.string(), "folderList"),
object : TypeToken<List<Folder>>() {}.type))

编辑:似乎文件夹似乎总是空

问题出在这里also的使用上。

private val folders: MutableLiveData<List<Folder>> by lazy {
MutableLiveData<List<Folder>>().also {
loadFolders()
}
}

also的定义

public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}

如您所见,loadFolders()也不会改变任何东西。因此,您没有对实时数据进行任何设置。

您应该直接返回

fun getFolders(): LiveData<List<Folder>> {
return loadFolders()
}

使用lazy可能不是一个正确的选择,因为您可能需要更改文件夹 ID。

最新更新