当 ViewModel
与 Room
结合使用时,可以构建出高效且架构良好的 Android 应用。
首先,创建 Room
数据库、实体、DAO
等相关组件。例如,假设有一个 User
实体表示用户信息:
@Entity(tableName = "users")
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "name")
private String name;
// 构造函数、getter 和 setter 方法
}
对应的 DAO
接口:
@Dao
public interface UserDao {
@Insert
void insertUser(User user);
@Query("SELECT * FROM users WHERE id = :userId")
User getUserById(int userId);
// 其他查询、更新、删除方法
}
数据库类:
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
在 ViewModel
中,通过依赖注入或者获取应用的上下文来获取数据库实例,并进行数据操作:
public class UserViewModel extends ViewModel {
private AppDatabase database;
private UserDao userDao;
public UserViewModel(AppDatabase database) {
this.database = database;
this.userDao = database.userDao();
}
public void insertUser(User user) {
new InsertUserAsyncTask(userDao).execute(user);
}
public LiveData<User> getUserById(int userId) {
return userDao.getUserById(userId);
}
private static class InsertUserAsyncTask extends AsyncTask<User, Void, Void> {
private UserDao userDao;
public InsertUserAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(User... users) {
userDao.insertUser(users[0]);
return null;
}
}
}
在视图(如 Activity
或 Fragment
)中使用 ViewModel
提供的数据:
public class UserActivity extends AppCompatActivity {
private UserViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(UserViewModel.class);
viewModel.getUserById(1).observe(this, new Observer<User>() {
@Override
public void onChanged(User user) {
// 根据获取到的用户数据更新视图
}
});
}
}
通过这样的结合,ViewModel
负责处理数据的获取和操作逻辑,Room
负责数据的持久化,使得应用的数据层更加清晰、高效和易于维护。