我必须创建一个帐户来问这个问题,因为我找不到正确的方法来执行此操作。唯一接近的是this question here,但它并没有完全消除,我仍然很困难。我们去...
我正在尝试遵循Architecture Components principles的大部分内容来构建应用程序。 我目前正在尝试在一个数据库表中添加一行,并获取该行的ID作为回报,然后在另一个表中插入行,并引用第一个表。
我已经创建了数据库对象:
@Entity(indices = {@Index("id")})
public class Search {
@PrimaryKey(autoGenerate = true) private int id;
...
以及相应的DAO:
@Dao
public interface SearchDao {
@Insert
long insert(Search search);
...
如您所见,我的DAO返回带有创建的ID的long。这是我之前链接的问题中指出的行为,并记录在here中。
由于我遵循Android体系结构组件原则,因此我使用Repository类来完成我所有与数据库相关的工作。在此存储库中,我创建了一个公共方法来插入一个新对象,该对象正在创建并执行AsyncTask来完成工作:
public class Repository {
public void insertSearch(Search search) {
new insertSearchAsyncTask(this.mSearchDao).execute(search);
}
...
private static class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {
private SearchDao mAsyncTaskDao;
insertSearchAsyncTask(SearchDao dao) {
this.mAsyncTaskDao = dao;
}
@Override
protected Long doInBackground(final Search... params) {
long id = this.mAsyncTaskDao.insert(params[0]);
return id;
}
}
我知道我可以使用onPostExecute(long id)方法对doInBackground方法的结果进行处理,但是此onPostExecute方法无法将任何内容返回给insertSearch方法,在此我创建了AsyncTask并执行了它。
我知道需要将我的insertSearch方法的返回类型更改为long。但是,如果我想返回一些东西,则需要获取AsyncTask执行的结果。 我该怎么做?
我尝试过this (according to the validated answer):
public class Repository {
private long result_id = 0;
public long insertSearch(Search search) {
new insertSearchAsyncTask(this.mSearchDao).execute(search);
return result_id;
}
private class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {
private SearchDao mAsyncTaskDao;
insertSearchAsyncTask(SearchDao dao) {
this.mAsyncTaskDao = dao;
}
@Override
protected Long doInBackground(final Search... params) {
long id = this.mAsyncTaskDao.insert(params[0]);
return id;
}
@Override
protected void onPostExecute(Long search_id) {
result_id = search_id;
}
}
}
但这感觉很非常错误。我必须使insertSearchAsyncTask类不是静态的,并且必须将insert的结果存储在我的属性中仓库。 我希望有一种更好/正确的方法。
我也在上面的链接中查看了其他建议的答案,尤其是关于Delegates的答案,但这不符合我的需要,因为我需要方法insertSearch返回结果,而不是AsyncTask在调用时返回的另一个方法完成。
我希望我已经清楚地解释了我的问题。 有人知道吗?
非常感谢!