在Android Room中,可以使用LiveData或者Flow来返回查询结果。这两个类都可以用于异步查询数据库并观察数据的变化。
使用LiveData来返回查询结果的示例代码如下:
首先,在DAO接口中定义一个返回LiveData的方法:
@Dao
public interface UserDao {
@Query("SELECT * FROM users WHERE id = :userId")
LiveData getUserById(int userId);
}
然后,在Repository或ViewModel中调用该方法,并在观察LiveData对象的时候处理返回结果:
public class UserRepository {
private UserDao userDao;
public UserRepository(UserDao userDao) {
this.userDao = userDao;
}
public LiveData getUserById(int userId) {
return userDao.getUserById(userId);
}
}
在观察LiveData对象时,可以使用observe()方法,并在回调中处理返回结果:
userRepository.getUserById(userId).observe(this, new Observer() {
@Override
public void onChanged(User user) {
if (user != null) {
// 查询成功,处理非空结果
} else {
// 查询为空,处理空结果
}
}
});
使用Flow来返回查询结果的示例代码如下:
首先,在DAO接口中定义一个返回Flow的方法:
@Dao
public interface UserDao {
@Query("SELECT * FROM users WHERE id = :userId")
Flow getUserById(int userId);
}
然后,在Repository或ViewModel中调用该方法,并在观察Flow对象的时候处理返回结果:
public class UserRepository {
private UserDao userDao;
public UserRepository(UserDao userDao) {
this.userDao = userDao;
}
public Flow getUserById(int userId) {
return userDao.getUserById(userId);
}
}
在观察Flow对象时,可以使用collect()方法,并在回调中处理返回结果:
userRepository.getUserById(userId).collect(new FlowCollector() {
@Override
public void emit(User user, @NotNull Continuation super Unit> continuation) {
if (user != null) {
// 查询成功,处理非空结果
} else {
// 查询为空,处理空结果
}
}
});
无论使用LiveData还是Flow,都可以根据返回结果的非空与否来判断查询是否成功或为空。