显示M V VM体系结构中数据库更改的ViewModel问题



在我尝试M V VM体系结构的过程中,我做了这个简单的示例,我的问题是viewModel在重新启动应用程序之前,不显示我对数据库所做的更改。

1-这是我的模型类:

@Entity
public class Product {
@ColumnInfo
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo
private String productTitle;
public Product(String productTitle) {this.productTitle = productTitle;}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getProductTitle() { return productTitle; }
public void setProductTitle(String productTitle) { this.productTitle = productTitle; }
}

2-这是DAO

@Dao
public interface ProductDao {
@Insert   void insert(Product product);
@Update   void update(Product product);
@Delete   void delete(Product product);
@Query("select * from Product")
List<Product> selectAll();
}

3-这是我的AppDatabase:

@Database(entities = { Product.class},version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static final String DATABASE_NAME = "productDB";
private static AppDatabase instance;
public abstract ProductDao getProductDao();
public static AppDatabase getInstance(Context context){
if (instance == null) {
instance = Room.databaseBuilder(context,AppDatabase.class,DATABASE_NAME)
.allowMainThreadQueries()
.build();}
return instance;
}
}

4-这是存储库:

public class ProductRepository {
private ProductDao productDao;
private List<Product> productList;
public ProductRepository(Application application) {
productDao = AppDatabase.getInstance(application).getProductDao();
productList = productDao.selectAll();
}
public void insert (Product myProduct) { productDao.insert(myProduct);}
public void delete (Product product)   { productDao.delete(product);}
public void update (Product product)   { productDao.update(product);}
public List<Product> selectAll()       { return productList;}
}

5-这是ViewModel:

public ProductViewModel(@NonNull Application application) {
super(application);
repository = new ProductRepository(application);
productList = repository.selectAll();
}
public void insert(Product product)  {  repository.insert(product);  }
public void delete (Product product) {  repository.delete(product);}
public void update(Product product)  {  repository.update(product);}
public List<Product> selectAll()     {  return productList;    }
}

最后,这是我在主活动中使用它的方式

.
.
public void btnInsertOnclick(View view) {
ProductViewModel productViewModel = new ViewModelProvider(this).get(ProductViewModel.class);
productViewModel.insert(new Product(" product" +String.valueOf(new Random().nextInt(100))  ));
//-----------> testDB();
List<Product> testList = productViewModel.selectAll();
for (Product item : testList) {
Log.e("dataBaseTest", "CAR #" + item.getId() + " " + item.getProductTitle() + " " );}
}
.
.

如果我使用存储库的实例而不是viewModel来制作上面的日志,我可以看到数据库已经发生了更改,但在我重新启动应用程序之前,viewModel实例不会显示更改。

最后我明白了:

使用";提供者";方法将产生一个";"singleton";例子因此,在制作ProductViewModel的下一个实例时,我将使用旧实例,当我在构造函数中填充产品列表时,我会得到旧数据。

为了解决这个问题,我在ProductViewModel中更改了selectAll方法,如下所示:

public List<Product> selectAll()     {  return repository.selectAll();    }

我只是好奇,为什么你的情况下不使用LiveData。每当您的数据库与列表相关时,LiveData都会自动通知您。

LiveData是一个可观察的数据持有者类。与常规的可观察对象不同,LiveData具有生命周期意识,这意味着它尊重其他应用程序组件的生命周期,如活动、片段或服务。这种意识确保LiveData只更新处于活动生命周期状态的应用程序组件观察员。

这样尝试-

[1] 将您的所有列表放入LiveData Holder中,如下面的

LiveData<List<Product>>

[2] 在onCreate中创建ViewMoel的实例,并观察LiveData变量

productViewModel = new ViewModelProvider(this).get(ProductViewModel.class);
productViewModel.selectAll().observe(getViewLifecycleOwner(), new Observer<List<Product>>() {
@Override
public void onChanged(List<Product> testList) {
for (Product item : testList) {
Log.d("dataBaseTest", "CAR #" + item.getId() + " " + item.getProductTitle() + "   size : " + testList.size());
}
}
});

[3] 然后你只需要在clicklistner中插入你的数据。

private void performAction() {
productViewModel.insert(new Product(" product" +String.valueOf(new Random().nextInt(100))  ));
}

相关内容

  • 没有找到相关文章

最新更新