当前位置: 首页 > 知识库问答 >
问题:

带有新线程和数据绑定问题的Room持久库

丌官翰采
2023-03-14

我正在工作的Android房间持久库。我还在我的项目中实现了双向数据绑定。在项目中,我插入用户的方法是填写一个表单,将所有用户显示在行中,然后单击“特定用户行”更新用户。下面是我的UserDao类:

@Dao
public interface UserDao {

  @Query("SELECT * FROM user")
  List<User> getAllUsers();

  @Insert
  void insertAll(User... users);

  @Update
  void updateUser(User... users);

  @Query("SELECT * FROM user WHERE user_id IN (:userId)")
  User getSpecifiedUser(int...userId);
 }

对于数据绑定,我绑定UserFormActivity中的用户模型

 private void getUserFormData(final int userId) {
    try {
        Thread t = new Thread(new Runnable() {
            public void run() {
                userModel = db.userDao().getSpecifiedUser(userId);
            }
        }, "Thread A");
        t.start();
    } catch (NumberFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在userModel中获取user数据进行更新后,我希望user数据在执行数据绑定的user表单中反映出来,但它没有反映出来。我被这个问题缠住了。

共有1个答案

万俟承望
2023-03-14

我在我的项目中实现了LiveData和ViewModel,并在我的UserListActivity中扩展了LifecycleActivity。下面是我的AddUserViewModel类:

public class AddUserViewModel extends AndroidViewModel {
     private UserDatabase userDatabase;

     public AddUserViewModel(Application application) {
      super(application);

     userDatabase = UserDatabase.getDatabase(this.getApplication());
     }

     public void addUser(User user) {
     new AddUserAsyncTask(userDatabase).execute(user);
     }

     private static class AddUserAsyncTask extends AsyncTask<User, Void, 
        Void> {

        private UserDatabase db;

        public AddUserAsyncTask(UserDatabase userDatabase) {
             db = userDatabase;
        }

     @Override
     protected Void doInBackground(User... params) {
         db.userDao().insertUser(params);
         return null;
         }
     }

    public User getSpecificUserData(int userId) {
        User user = null;
        try {
             user = new 
             getUserDataAsyncTask(userDatabase).execute(userId).get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
           }
        return user;
    }

    private static class getUserDataAsyncTask extends AsyncTask<Integer, 
        Void, User> {

        private UserDatabase db;

        public getUserDataAsyncTask(UserDatabase userDatabase) {
            db = userDatabase;
        }

        @Override
        protected User doInBackground(Integer... userId) {
            User user = db.userDao().getSpecifiedUser(userId);
            return user;
        }

        @Override
        protected void onPostExecute(User user) {
            super.onPostExecute(user);
        }
      }
  }

在AddUserActivity中,我从数据库方法获取特定的用户数据

userModel=AddUserViewModel.GetSpecificUserData(userId);

 userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);

    userViewModel.getUserList().observe(UserListActivity.this, new 
    Observer<List<User>>() {
        @Override
        public void onChanged(@Nullable List<User> user) {
            adapter.addItems(user);
        }
    });

这对我来说很好,我得到了我的解决方案!

 类似资料:
  • 我有以下问题:我正在使用Koin进行DI和持久化的空间。现在我的房间依赖关系如下: 但是我得到了这里描述的错误:Android room Persistent:AppDatabase_Impl不存在 Koin模块定义: 怎么会这样呢?

  • 数据落盘问题的由来 这本质上是数据持久化问题,对于有些应用依赖持久化数据,比如应用自身产生的日志需要持久化存储的情况,需要保证容器里的数据不丢失,在Pod挂掉后,其他应用依然可以访问到这些数据,因此我们需要将数据持久化存储起来。 数据落盘问题解决方案 下面以一个应用的日志收集为例,该日志需要持久化收集到ElasticSearch集群中,如果不考虑数据丢失的情形,可以直接使用前面提到的应用日志收集一

  • 我想使用预先填充的数据库的房间,但我不明白如何告诉房间在哪里找到我的数据库。 现在我将它放在中,当我为房间数据库创建实例时,我是这样创建的: 这样一来,我认为它每次都在创建一个新的数据库,或者说,它没有使用预填充的数据库。 我怎样才能找到我的数据库?

  • 我们正在尝试为我们的新项目设置一个新的JTA事务配置。该项目利用Spring JPA和Spring Data与atomikos JTA事务管理器。 正如在atomikos教程中看到的那样,我们配置了XML。 目前,我们设法启动我们的服务器没有错误。 问题是,当我们尝试在@Transactional服务中使用jpaRepository持久化实体时,我们的日志显示atomikos jta事务正在发生并

  • pinia的数据持久化,我用了个插件pinia-plugin-persist,用了该插件后数据是持久化了,但是取的值变成了字符串,需要序列化转换一下,例如:存入对象取出时时字符串,需要再次转换为对象才能使用,有没有什么好的方法,不用每次取值都转换一下?

  • 下面是Kotlin中的类: 但当我试图运行应用程序时,它立即崩溃。以下是崩溃日志: 类似乎不是自动生成的。我检查了从codelab下载的原始java应用程序,发现是自动生成的。