也许我误解了这一切,但如何使用实时数据/视图模型/存储库编辑数据?我看到如何查询所有数据,删除一个条目,但我想编辑一个特定的字段。
例如,我有三件事我正在跟踪。日期、时间和类别。我需要能够更改类别。
我在我的一项活动中尝试过这样做:
budgetViewModel.getAllEntries().observe(this, new Observer<List<BudgetEntry>>() {
@Override
public void onChanged(List<BudgetEntry> budgetEntries) {
Log.i(TAG, "2nd Observer is going off");
if (manualUpdate == 1) {
Log.i(TAG, "MANUAL UPDATE");
budgetEntries.get(0).setCategory(updatedCategory);
manualUpdate = 0;
Log.i(TAG, "Budget Entries: " + budgetEntries.get(0).getCategory());
}
else {
Log.i(TAG, "No change");
}
}
});
}
}
但它不会永久改变它。只有在这个例子中,我猜是因为日志显示我更改了类别,但当我重新加载应用程序或检查其他活动时,它仍然显示先前的数据。
我找不到这方面的任何教程,所以任何指导将不胜感激!
新视图模型更改。i get error无法创建类的示例:
公共类budgetviewmodel扩展了androidviewmodel{
private BudgetRepository budgetRepository;
//private LiveData<List<BudgetEntry>> allEntries;
LiveData<List<BudgetEntry>> _allEntries = budgetRepository.getAllEntries();
LiveData<List<BudgetEntry>> allEntries = Transformations.map(_allEntries, new Function<List<BudgetEntry>, List<BudgetEntry>>() {
@Override
public List<BudgetEntry> apply(List<BudgetEntry> input) {
return input;
}
});
public BudgetViewModel(@NonNull Application application) {
super(application);
budgetRepository = new BudgetRepository(application);
//allEntries = budgetRepository.getAllEntries();
}
public void insert (BudgetEntry budgetEntry) {
budgetRepository.insert(budgetEntry);
}
public void delete (BudgetEntry budgetEntry) {
budgetRepository.delete(budgetEntry);
}
public void deleteAllEntries () {
budgetRepository.deleteAllEntries();
}
public LiveData<List<BudgetEntry>> getAllEntries() {
return _allEntries;
}
public LiveData<Integer> getCount() {
return budgetRepository.getCount();
}
}
谢谢!
2条答案
按热度按时间13z8s7eq1#
我终于明白了,呜呼!我无法得到转换的答案,所以我开始研究如何使用@update。我想和大家分享一下,以防将来能帮上什么忙,因为这次花了我几个星期的时间
我在我的模型里追踪了三件事。类别、日期、时间。我的目标是能够将与特定字符串匹配的所有类别名称更改为新字符串。
首先,您需要在模型中命名列:
@columninfo(name=“category”)私有字符串类别;
然后您需要在dao中创建一个sql查询,用新类别查找并更新旧类别:
这基本上是说找到所有与字符串匹配的类别,并将它们更新为新字符串。
现在需要在视图模型和存储库中创建方法。
我们将从存储库开始创建一个异步任务。首先,我需要将旧类别和新类别捆绑在一起,以便在存储库中创建一个类。
然后我将创建一个传递这些参数的异步任务。
私有静态类updatecolumnasynctask扩展了asynctask<paramssend,void,void>{private budgetdao budgetdao;
然后创建调用异步任务的方法:
然后我们将转到viewmodel并创建一个方法来运行repository中的异步任务:
最后,我们将在活动中更新:
祝大家好运,希望这有帮助!:-)
anauzrmj2#
为此,可以在viewmodel中使用transformations.map函数。
将主线程上的给定函数应用于源livedata发出的每个值,并返回livedata,后者发出结果值。
给定的函数func将在主线程上执行。
Kotlin
java
现在你可以观察了
allEntries
像往常一样。这个map
函数负责更新livedata。