Android房-插入行的ID-来自ViewModel

时间:2018-07-28 16:22:44

标签: android

我正在使用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可能是一个不错的选择,但是老实说,我不希望任何想法实现它:(

1 个答案:

答案 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。