Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用存储库更新文件室数据库中的字段&;视图模型_Java_Android_Sqlite_Android Room - Fatal编程技术网

Java 如何使用存储库更新文件室数据库中的字段&;视图模型

Java 如何使用存储库更新文件室数据库中的字段&;视图模型,java,android,sqlite,android-room,Java,Android,Sqlite,Android Room,我创建了一个房间数据库,它利用存储库: 存储库管理查询线程,并允许您使用多个后端。在最常见的示例中,存储库实现了用于决定是从网络获取数据还是使用缓存在本地数据库中的结果的逻辑 我遵循了指南,现在能够创建实体的并检索数据。我甚至更进一步,在指南的范围之外创建了另一个完整的实体 然而,我找不到很多使用这种MVVM(?)风格的资源,所以我很难真正理解存储库。现在我想更新一个字段。只有一个,就好像我能管理其他的应该是相似的 我想更新一个名为dartshit的字段,并为此创建了dao方法: @查询(“更新

我创建了一个房间数据库,它利用存储库:

存储库管理查询线程,并允许您使用多个后端。在最常见的示例中,存储库实现了用于决定是从网络获取数据还是使用缓存在本地数据库中的结果的逻辑

我遵循了指南,现在能够创建实体的并检索数据。我甚至更进一步,在指南的范围之外创建了另一个完整的实体

然而,我找不到很多使用这种MVVM(?)风格的资源,所以我很难真正理解存储库。现在我想更新一个字段。只有一个,就好像我能管理其他的应该是相似的

我想更新一个名为dartshit的字段,并为此创建了dao方法:

@查询(“更新AtcUserStats集合:金额,其中用户名=:用户名”) void UpdateHitAmount(整数金额,字符串用户名)

我有一个存储库,我假设我用于所有实体:

public class UsersRepository {

private UsersDao mUsersDao;
private AtcDao mAtcDao;
private LiveData<List<Users>> mAllUsers;
private LiveData<List<AtcUserStats>> mAllAtc;
private AtcUserStats mAtcUser;

UsersRepository(Application application) {
    AppDatabase db = AppDatabase.getDatabase(application);
    mUsersDao = db.usersDao();
    mAtcDao = db.atcDao();
    mAllUsers = mUsersDao.fetchAllUsers();
    mAllAtc = mAtcDao.getAllAtcStats();
}

LiveData<List<Users>> getAllUsers() {
    return mAllUsers;
}

LiveData<List<AtcUserStats>> getAllAtcStats() {
    return mAllAtc;
}

LiveData<AtcUserStats> getAtcUser(String username) {

    return mAtcDao.findByName(username);
}

public void insert (Users user) {
    new insertAsyncTask(mUsersDao).execute(user);
}

public void insertAtc (AtcUserStats atc) {
    new insertAsyncAtcTask(mAtcDao).execute(atc);
}

private static class insertAsyncTask extends AsyncTask<Users, Void, Void> {

    private UsersDao mAsyncTaskDao;

    insertAsyncTask(UsersDao dao) {
        mAsyncTaskDao = dao;
    }

    @Override
    protected Void doInBackground(final Users... params) {
        mAsyncTaskDao.insertNewUser(params[0]);
        return null;
    }
}

private static class insertAsyncAtcTask extends AsyncTask<AtcUserStats, Void, Void> {

    private AtcDao mAsyncTaskDao;

    insertAsyncAtcTask(AtcDao dao) {
        mAsyncTaskDao = dao;
    }

    @Override
    protected Void doInBackground(final AtcUserStats... params) {
        mAsyncTaskDao.insertNewAtcUser(params[0]);
        return null;
    }
}
}
不正确的是,我得到了一个llegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI。错误。但是我认为这个任务应该解决这个问题

以下是我的视图模型中的更新方法,该方法报告0个错误:

  void updateHitAmount (int amount, String name) {
    mRepository.updateAtcHits(amount, name);
}
这是我试图将所有这些联系在一起的UI代码,我想肯定有更好的方法可以使用onChanged来简单地更新字段,但我还是很难找到关于google的任何建议:

   private void callOnChanged() {

    mAtcViewModel = ViewModelProviders.of(this).get(AtcViewModel.class);

    mAtcViewModel.getAllUsers().observe(this, new Observer<List<AtcUserStats>>() {
        @Override
        public void onChanged(@Nullable final List<AtcUserStats> atc) {
            // Update the cached copy of the users in the adapter.


            for (int i = 0; i < atc.size(); i++) {
                if (atc.get(i).getUserName().equals(mUser)) {
                    mAtcViewModel.updateHitAmount(55, mUser);
                    //atc.get(i).setDartsHit(55);
                    Log.d("id", String.valueOf(userSelected.getId()));
                }
            }
        }
    });
private void callOnChanged(){
mAtcViewModel=ViewModelProviders.of(this.get)(AtcViewModel.class);
mAtcViewModel.getAllUsers().observe(这个,新的观察者(){
@凌驾
更改后的公共无效(@Nullable final List atc){
//更新适配器中用户的缓存副本。
对于(int i=0;i

如何在后台线程上使用这种方法更新字段?

根据这个答案,我找到了答案。这主要是因为我对AsyncTask缺乏了解。本质上,我需要创建一个对象并以这种方式传递数据,然后在后台执行:

 private static class MyTaskParams {
    int amount;
    String name;

    MyTaskParams(int amount, String name) {
        this.amount = amount;
        this.name = name;
    }
}

public void updateAtcHits (int amount, String name) {

    MyTaskParams params = new MyTaskParams(amount,name);
    new updateHitAsyncTask(mAtcDao).execute(params);
}

private class updateHitAsyncTask extends AsyncTask<MyTaskParams,Void,Void>{

    private AtcDao mAsyncTaskDao;

    public updateHitAsyncTask(AtcDao mAtcDao) {

        mAsyncTaskDao = mAtcDao;
    }

    @Override
    protected Void doInBackground(MyTaskParams... myTaskParams) {
        int amount =myTaskParams[0].amount;
        String name = myTaskParams[0].name;
        mAsyncTaskDao.UpdateHitAmount(amount, name);
        return null;
    }
}
私有静态类MyTaskParams{
整数金额;
字符串名;
MyTaskParams(整数金额、字符串名称){
这个。金额=金额;
this.name=名称;
}
}
public void updateachits(整数金额、字符串名称){
MyTaskParams params=新的MyTaskParams(金额、名称);
新建updateHitAsyncTask(mAtcDao).execute(params);
}
私有类updateHitAsyncTask扩展了AsyncTask{
私人AtcDao mAsyncTaskDao;
公共更新HitaSyncTask(AtcDao mAtcDao){
mAsyncTaskDao=mAtcDao;
}
@凌驾
受保护的Void doInBackground(MyTaskParams…MyTaskParams){
int amount=myTaskParams[0]。金额;
字符串名称=myTaskParams[0]。名称;
mAsyncTaskDao.UpdateHitAmount(金额、名称);
返回null;
}
}
 private static class MyTaskParams {
    int amount;
    String name;

    MyTaskParams(int amount, String name) {
        this.amount = amount;
        this.name = name;
    }
}

public void updateAtcHits (int amount, String name) {

    MyTaskParams params = new MyTaskParams(amount,name);
    new updateHitAsyncTask(mAtcDao).execute(params);
}

private class updateHitAsyncTask extends AsyncTask<MyTaskParams,Void,Void>{

    private AtcDao mAsyncTaskDao;

    public updateHitAsyncTask(AtcDao mAtcDao) {

        mAsyncTaskDao = mAtcDao;
    }

    @Override
    protected Void doInBackground(MyTaskParams... myTaskParams) {
        int amount =myTaskParams[0].amount;
        String name = myTaskParams[0].name;
        mAsyncTaskDao.UpdateHitAmount(amount, name);
        return null;
    }
}