我的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。