在Android MVVM架构下,推荐使用Repository类来存储数据。这个类是一个中介者,连接ViewModel和数据源——可能是网络、本地数据库等等。而Single Activity Architecture指的是整个应用只有一个Activity,这个Activity承载了所有Fragment。因此,该Activity需要实现ViewModelStoreOwner接口,并把ViewModelStore对象传给Fragment。在Repository中,我们可以使用Room库来管理本地数据库,并使用Retrofit等网络库来处理网络请求。
下面是一个简单的例子,演示如何使用Repository类来存储数据。
首先,定义一个数据实体类。
@Entity
public class User {
@PrimaryKey
public int id;
public String name;
}
然后,定义一个DAO接口,用来定义数据库的操作。
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
LiveData> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(User user);
}
接下来,创建一个RoomDatabase的子类。
@Database(entities = {User.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
然后,在Repository中,我们可以使用Room来管理数据库,并使用Retrofit来处理网络请求。
public class UserRepository {
private static UserRepository instance;
private final UserDao userDao;
private final ApiService apiService;
private UserRepository(Context context) {
MyDatabase database = Room.databaseBuilder(context, MyDatabase.class, "my_database").build();
userDao = database.userDao();
apiService = Retrofit.Builder().baseUrl("https://api.example.com").build().create(ApiService.class);
}
public static UserRepository getInstance(Context context) {
if (instance == null) {
instance = new UserRepository(context);
}
return instance;
}
public LiveData> getAllUsers() {
// 从本地数据库获取数据
return userDao.getAll();
}
public void refreshUsers() {
// 从网络获取数据,并保存到本地数据库
apiService.getUsers().enqueue(new Callback>() {
// 省略回调方法的实现
});
}
public void addUser(User user) {
// 添加用户到本地数据库
new AsyncTask() {
@Override
protected Void doInBackground(User... params) {
userDao.insert(params[0]);
return null;
}
}.execute(user);
}
}
最后,在ViewModel中,我们可以使用LiveData来观察数据的变化,并把数据从Repository中取出。
public class MyViewModel extends ViewModel {
private final UserRepository userRepository;
private LiveData> userLiveData;
public MyViewModel(Context context) {
userRepository = UserRepository.getInstance(context);
}
public LiveData> getAllUsers() {
if (userLiveData == null) {
userLiveData = userRepository.getAllUsers();
}
return userLiveData