在没有 ViewModel 的情况下使用 Room
Using Room without ViewModel
我刚开始使用 android 房间。唯一的问题是,
数据库交互需要几层。
Table Class -> Dao 接口 -> 数据库回购 -> ViewModels
而且每一层都有代码重复。
好像我直接从 Repo 调用查询,没有 viewModels,它不会允许。因为没有 viewModel 观察器的调用变成同步的,这会阻塞主线程。
要么必须有异步调用 repo 的标准方法,要么有一些技巧。
也许我们可以使用一些异步泛型 class,它可以让您将查询和 return 结果传递给主线程。
可能存在黑客攻击。不知道方法对不对
AsyncTask.execute(new Runnable() {
@Override
public void run() {
List<User> users = apiService.getAllUsers();
if(users.size()>0)
{
System.out.println("Total users:"+users.size());
System.out.println("Email:"+users.get(0).getEmail());
}
}
});
您可以为此使用 AsyncTask 而无需 ViewModels。
AsyncTask.execute {
val entity = daoInterface.queryFunction()
...
}
如果您只是测试 Room,那么只需致电
.allowMainThreadQueries()
如果您正在构建一个真正的应用程序,那么跳过这个 Android 架构是没有意义的。
您看到的解释层 here 或在您的应用程序中没有引入代码重复,看起来是这样,但它使您的应用程序模块化。如果您的应用程序可扩展并且您需要重用或更改某些内容,那将会容易得多。
此外,ViewModel
不会使调用异步。使它们起作用的是 LiveData
(当你包装你时 return 在 Dao class 中输入 LiveData
)。
ViewModel
用于从视图(Activity 或片段)中抽象出与视图无关的逻辑,并让数据在配置更改后仍然存在,此外 ViewModel
你将避免拥有上帝 Activity
处理一切。
您有多种选择:
1) 您可以使用@EarlOfEgo 提到的AsyncTask
来执行insert
。当您 query
您的数据库时,只需将 return 类型包装在 LiveData
中即可。 AsyncTask 的一个小例子,取自 codelab page 8:
private static class insertAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao mAsyncTaskDao;
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Word... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
2) 如果您不需要观察数据库中的更改,那么您可以完全避免 LiveData
并在单独的线程上手动处理所有查询和插入的执行。或者另一种选择是只从 LiveData
接收一个更新并取消注册监听器(或者我相信有一个 LiveData
的实现只接收一个更新)。
3) 或者你可以 .allowMainThreadQueries()
我刚开始使用 android 房间。唯一的问题是, 数据库交互需要几层。 Table Class -> Dao 接口 -> 数据库回购 -> ViewModels
而且每一层都有代码重复。
好像我直接从 Repo 调用查询,没有 viewModels,它不会允许。因为没有 viewModel 观察器的调用变成同步的,这会阻塞主线程。
要么必须有异步调用 repo 的标准方法,要么有一些技巧。 也许我们可以使用一些异步泛型 class,它可以让您将查询和 return 结果传递给主线程。
可能存在黑客攻击。不知道方法对不对
AsyncTask.execute(new Runnable() {
@Override
public void run() {
List<User> users = apiService.getAllUsers();
if(users.size()>0)
{
System.out.println("Total users:"+users.size());
System.out.println("Email:"+users.get(0).getEmail());
}
}
});
您可以为此使用 AsyncTask 而无需 ViewModels。
AsyncTask.execute {
val entity = daoInterface.queryFunction()
...
}
如果您只是测试 Room,那么只需致电
.allowMainThreadQueries()
如果您正在构建一个真正的应用程序,那么跳过这个 Android 架构是没有意义的。
您看到的解释层 here 或在您的应用程序中没有引入代码重复,看起来是这样,但它使您的应用程序模块化。如果您的应用程序可扩展并且您需要重用或更改某些内容,那将会容易得多。
此外,ViewModel
不会使调用异步。使它们起作用的是 LiveData
(当你包装你时 return 在 Dao class 中输入 LiveData
)。
ViewModel
用于从视图(Activity 或片段)中抽象出与视图无关的逻辑,并让数据在配置更改后仍然存在,此外 ViewModel
你将避免拥有上帝 Activity
处理一切。
您有多种选择:
1) 您可以使用@EarlOfEgo 提到的AsyncTask
来执行insert
。当您 query
您的数据库时,只需将 return 类型包装在 LiveData
中即可。 AsyncTask 的一个小例子,取自 codelab page 8:
private static class insertAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao mAsyncTaskDao;
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Word... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
2) 如果您不需要观察数据库中的更改,那么您可以完全避免 LiveData
并在单独的线程上手动处理所有查询和插入的执行。或者另一种选择是只从 LiveData
接收一个更新并取消注册监听器(或者我相信有一个 LiveData
的实现只接收一个更新)。
3) 或者你可以 .allowMainThreadQueries()