如何检查房间数据库是否为空

问题描述:

我正在尝试在进行网络呼叫之前检查房间数据库是否为空.但显示以下错误.

I am trying to check if room database is empty or not before making a network call. but it is showing below error.

错误:不确定如何将Cursor转换为该方法的返回类型(java.lang.Integer).

error: Not sure how to convert a Cursor to this method's return type (java.lang.Integer).

我一直在做的是,当应用启动时,我正在检查房间数据库中的行数是否为空,然后才进行网络呼叫.

What I have been doing is when app starts I am checking row count in room databse if it is null then I am making a network call.

下面是我的代码.

UserDao.java

@Dao
public interface UserDao {

   @Query("SELECT * FROM Users")
   LiveData<Integer> isDbEmpty();
}    

UserRepository.java

public class UserRepository {

private Context context;
private UserDb userDb;
private LiveData<Integer> checkDb;
private UserDao userDao;


public UserRepository(Context context) {
    this.context = context;
    userDb = UserDb.getInstance(context);
    userDao = userDb.userDao();
    checkDb = userDao.isDbEmpty();
}

public LiveData<Integer> isDbEmpty(){
    return checkDb;
}

}  

UserViewModel.java

public class UserViewModel extends AndroidViewModel {

private UserRepository repo;
private LiveData<Integer> checkDb;

public UserViewModel(@NonNull Application application) {
    super(application);

    repo = new UserRepository(application);
    checkDb = repo.isDbEmpty();
 }

public LiveData<Integer> getCheckDb() {
    return checkDb;
 }
}

MainActivity.java

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Toolbar toolbar = findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);

 userRepository = new UserRepository(this);
    userModel = ViewModelProviders.of(MainActivity.this).get(UserViewModel.class);


 userModel.getCheckDb().observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(Integer rowCount) {

            if(rowCount == 0){
                userRepository.getUserList();
            }
        }
    });

 }

请让我知道我做错了什么.任何帮助将不胜感激.

Someone please let me know what I am doing wrong. Any help would be appreciated.

谢谢

UserDao 上的返回类型应该是 LiveData< List< User>> 选择之后,只需检查从该查询返回的列表的大小即可.

The return type on your UserDao should be a LiveData<List<User>> and than after selection just check the size of the list returned from that query.

当您输入 Integer 且查询是该表中的 SELECT 时, Room 不知道 User 表与 Integer

When you put Integer and the query is a SELECT from that table, Room doesn't know how the User table matches an Integer

   @Query("SELECT * FROM Users")
   LiveData<List<User>> selectAllUsers();

与调用该方法相比,只需检查 if(usersList.size()!= 0){}

And than when you call that method just check if(usersList.size() != 0){}