【问题标题】:Android room - id of insterted row - from ViewModelAndroid 房间 - 插入行的 id - 来自 ViewModel
【发布时间】:2018-07-28 16:22:44
【问题描述】:

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

【问题讨论】:

    标签: android


    【解决方案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();
    }
    

    最后在你的 Activity 中:

    mProductViewModel.getLastProductLive().observe(this, product -> {
        long lastInsertedRowId = product.getId();
    }
    

    通过使用LiveData,任何时候将产品添加到表中,都会触发此方法,您可以获取最后插入的行的id。

    【讨论】:

    • dao的insert方法本身返回一个long变量,里面保存着插入行的id。为什么不能使用?
    猜你喜欢
    • 2018-05-22
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多