gpt4 book ai didi

java - 显示 MV VM 架构中的数据库更改的 ViewModel 问题

转载 作者:行者123 更新时间:2023-12-04 09:22:30 24 4
gpt4 key购买 nike

在我尝试接近 MV 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-这是 View 模型:
    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; }
}
最后这是我在主 Activity 中使用它的方式:
.
.
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 实例在我重新启动应用程序之前不会显示更改。

最佳答案

最后我明白了一点:
使用 "provider"方法创建 ViewModel 将生成一个 "singleton"实例。因此,在下一个 ProductViewModel 实例制作中,我将使用旧的,并且当我在构造函数中填写产品列表时,我将获得旧数据。
为了解决这个问题,我更改了 ProductViewModel 中的 selectAll 方法,如下所示:

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

关于java - 显示 MV VM 架构中的数据库更改的 ViewModel 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63075299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com