房间数据库查询
Room Database Query
我是 Room
的新手,我正在尝试 query
我的 database
从中获得 row
。我尝试通过 querying
它与 primary key
这是 id 但问题是我不知道如何 return 来自 [=19= 的目标 object
].
这是Dao
@Query("SELECT * FROM targets WHERE id = :id LIMIT 1")
Targets findTargetById(int id);
这是存储库 class
public Targets findTarget (int id) {
new findTargetByIDAsyncTask(mTargetsDao).execute(id);
}
private static class findTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private TargetsDao mAsyncTaskDao;
findTargetByIDAsyncTask(TargetsDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
super.onPostExecute(targets);
}
}
您有两种方法可以return一个结果。
第一种方法是调用 AsyncTask.get()
方法,但它仍然会持有一个 MainThread,如果任务超过 5 秒就会导致 ANR:
public Targets findTarget (int id) {
return new findTargetByIDAsyncTask(mTargetsDao).execute(id).get();
}
第二种方式比较复杂,但是不会hold住MainThread。您应该添加一个回调 class:
public interface Callback {
void onSuccess(Targets targets);
}
您存储库的每个方法如下所示:
public void findTarget (Callback callback, int id) {
new findTargetByIDAsyncTask(mTargetsDao, callback).execute(id);
}
AsynTask 看起来像这样:
private static class FindTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private final TargetsDao mAsyncTaskDao;
private final Callback callback;
FindTargetByIDAsyncTask(TargetsDao dao, Callback callback) {
mAsyncTaskDao = dao;
this.callback = callback;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
callback.onSuccess(targets);
}
}
重点是从后台线程获取 data/object。您可以使用 Android 的 AsyncTask
或 ExecutorService
。一个简单的例子是如果你想得到一个用户名的字符串,方法是:
private String getName() {
String name = null;
try {
name = Executors.newSingleThreadExecutor().submit(() ->
userDao.fetchUserName()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return name;
}
我是 Room
的新手,我正在尝试 query
我的 database
从中获得 row
。我尝试通过 querying
它与 primary key
这是 id 但问题是我不知道如何 return 来自 [=19= 的目标 object
].
这是Dao
@Query("SELECT * FROM targets WHERE id = :id LIMIT 1")
Targets findTargetById(int id);
这是存储库 class
public Targets findTarget (int id) {
new findTargetByIDAsyncTask(mTargetsDao).execute(id);
}
private static class findTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private TargetsDao mAsyncTaskDao;
findTargetByIDAsyncTask(TargetsDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
super.onPostExecute(targets);
}
}
您有两种方法可以return一个结果。
第一种方法是调用 AsyncTask.get()
方法,但它仍然会持有一个 MainThread,如果任务超过 5 秒就会导致 ANR:
public Targets findTarget (int id) {
return new findTargetByIDAsyncTask(mTargetsDao).execute(id).get();
}
第二种方式比较复杂,但是不会hold住MainThread。您应该添加一个回调 class:
public interface Callback {
void onSuccess(Targets targets);
}
您存储库的每个方法如下所示:
public void findTarget (Callback callback, int id) {
new findTargetByIDAsyncTask(mTargetsDao, callback).execute(id);
}
AsynTask 看起来像这样:
private static class FindTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private final TargetsDao mAsyncTaskDao;
private final Callback callback;
FindTargetByIDAsyncTask(TargetsDao dao, Callback callback) {
mAsyncTaskDao = dao;
this.callback = callback;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
callback.onSuccess(targets);
}
}
重点是从后台线程获取 data/object。您可以使用 Android 的 AsyncTask
或 ExecutorService
。一个简单的例子是如果你想得到一个用户名的字符串,方法是:
private String getName() {
String name = null;
try {
name = Executors.newSingleThreadExecutor().submit(() ->
userDao.fetchUserName()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return name;
}