我正在使用Android Room,我想获取新插入行的ID。我已经在模型类中声明了列:
@PrimaryKey (autoGenerate = true)
@ColumnInfo (name = "productID")
int id;
然后我知道我可以通过dao返回long来检索它:
@Insert
long insert(Product p);
起初,我直接在View中使用“线程”调用。如您所知,不建议使用此方法。所以我正在尝试为ModelView和存储库更改它。但是我不知道如何获取此ID。
我的存储库类:
public class ProductRepository {
private ProductDao mProductDao;
ProductRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mProductDao = db.pDao();
}
public void insertProduct(Product p) {
new insertAsyncTask(mProductDao).execute(p);
}
private static class insertAsyncTask extends AsyncTask<Product, Void, Void> {
private ProductDao mAsyncTaskDao;
insertAsyncTask(ProductDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Product... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
}
我的模型课:
public class ProductModelView extends AndroidViewModel {
private ProductRepository mRepository;
public ProductModelView(Application application) {
super(application);
mRepository = new ProductRepository(application);
}
public void insert(Product p) {
mRepository.insertProduct(p);
}
}
在“活动”中,我将像这样插入新对象:
mProductModelView.insert(pc);
那么我该如何从“插入”中检索此长值并将其添加到我的活动中?我想LiveData可能是一个不错的选择,但是老实说,我不希望任何想法实现它:(
答案 0 :(得分:1)
执行此操作的最佳方法是使用LiveData。如果您想使用MVVM,不妨学习如何使用LiveData。很简单。
在您的DAO界面中,声明这样的方法:
@Query("SELECT * FROM Product ORDER BY id DESC LIMIT 1")
LiveData<Product> getLastProductLive();
此方法返回以LiveData插入的最后一个产品
然后在您的存储库中:
public LiveData<Product> getLastProductLive(){
return mProductDao.getLastProductLive();
}
然后在您的ViewModel中:
public LiveData<Product> getLastProductLive(){
return mRepository.getLastProductLive();
}
最后进入您的活动:
mProductViewModel.getLastProductLive().observe(this, product -> {
long lastInsertedRowId = product.getId();
}
通过使用LiveData,只要将产品添加到表中,就会触发此方法,并且您可以获得最后插入的行的ID。