java—如何在视图模型/存储库中使用实时数据编辑条目

yyhrrdl8  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(302)

也许我误解了这一切,但如何使用实时数据/视图模型/存储库编辑数据?我看到如何查询所有数据,删除一个条目,但我想编辑一个特定的字段。
例如,我有三件事我正在跟踪。日期、时间和类别。我需要能够更改类别。
我在我的一项活动中尝试过这样做:

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();
}

}
谢谢!

13z8s7eq

13z8s7eq1#

我终于明白了,呜呼!我无法得到转换的答案,所以我开始研究如何使用@update。我想和大家分享一下,以防将来能帮上什么忙,因为这次花了我几个星期的时间
我在我的模型里追踪了三件事。类别、日期、时间。我的目标是能够将与特定字符串匹配的所有类别名称更改为新字符串。
首先,您需要在模型中命名列:
@columninfo(name=“category”)私有字符串类别;
然后您需要在dao中创建一个sql查询,用新类别查找并更新旧类别:

@Query("UPDATE entry SET CATEGORY = :newcategory WHERE category = :oldcategory")
void updateColumn(String newcategory, String oldcategory);

这基本上是说找到所有与字符串匹配的类别,并将它们更新为新字符串。
现在需要在视图模型和存储库中创建方法。
我们将从存储库开始创建一个异步任务。首先,我需要将旧类别和新类别捆绑在一起,以便在存储库中创建一个类。

private static class ParamsSend {
    String newCategory;
    String oldCategory;

    ParamsSend(String newCategory, String oldCategory) {
        this.newCategory = newCategory;
        this.oldCategory = oldCategory;
    }
}

然后我将创建一个传递这些参数的异步任务。
私有静态类updatecolumnasynctask扩展了asynctask<paramssend,void,void>{private budgetdao budgetdao;

private UpdateColumnAsyncTask(BudgetDao budgetDao) {
        this.budgetDao = budgetDao;
    }

    @Override
    protected Void doInBackground(ParamsSend... paramsSends) {
        String newCategory = paramsSends[0].newCategory;
        String oldCategory = paramsSends[0].oldCategory;
        budgetDao.updateColumn(newCategory, oldCategory);
        return null;
    }
}

然后创建调用异步任务的方法:

public void updateColumn(String newCategory, String oldCategory) {

    ParamsSend paramsSend  = new ParamsSend(newCategory, oldCategory);
    new UpdateColumnAsyncTask(budgetDao).execute(paramsSend);
}

然后我们将转到viewmodel并创建一个方法来运行repository中的异步任务:

public void updateColumn(String newCategory, String oldCategory) {
    budgetRepository.updateColumn(newCategory, oldCategory);

最后,我们将在活动中更新:

budgetViewModel.updateColumn(updatedCategory, oldCategory);

祝大家好运,希望这有帮助!:-)

anauzrmj

anauzrmj2#

为此,可以在viewmodel中使用transformations.map函数。
将主线程上的给定函数应用于源livedata发出的每个值,并返回livedata,后者发出结果值。
给定的函数func将在主线程上执行。
Kotlin

import androidx.lifecycle.*

class YourViewModel : ViewModel() {
  private val _allEntries: LiveData<List<BudgetEntry>> = budgetRepository.getAllEntries()
  val allEntries: LiveData<List<BudgetEntry>> = Transformations.map(_allEntries) { list: List<BudgetEntry> ->
    list.map { budgetEntry ->
       budgetEntry.setCategory(updatedCategorya)
    }
  }
}

java

import androidx.lifecycle.*;

class YourViewModel extends ViewModel {
  private final LiveData<List<BudgetEntry>> _allEntries = budgetRepository.getAllEntries();
  final LiveData<List<BudgetEntry>> allEntries = Transformations.map(_allEntries, new Function<List<BudgetEntry>, List<BudgetEntry>>() {
        @Override
        public List<BudgetEntry> apply(List<BudgetEntry> input) {
            // do the mapping for each budgetEntry
            return // mapped list
        }
    });
}

现在你可以观察了 allEntries 像往常一样。这个 map 函数负责更新livedata。

相关问题