我想用Rxjava使用ROOM,以下是我的代码:
我的数据库结构类:
@Entity(tableName = "productSample1")
public class ProductEntity {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private String price;
public ProductEntity(int id, String name, String price) {
this.id = id;
this.name = name;
this.price = price;
}
@Ignore
public ProductEntity(String name, String price) {
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
这是我的ProductDAO课程:
@Dao
public interface ProductDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity productEntity);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<ProductEntity> products);
@Delete
void delete(ProductEntity productEntity);
@Query("SELECT * FROM productSample1 where id=:id")
ProductEntity getProductById(int id);
@Query("Select * from productSample1 order by id desc")
LiveData<List<ProductEntity>>getAll();
@Query("Select * from productSample1 order by id desc")
Single<List<ProductEntity>> getAllRXjava();
@Query("delete from productSample1")
int deleteAll();
@Query("select count(*) from productSample1")
int getCount();
}
这是我用于创建和管理数据库的数据库类:
@Database(entities = {ProductEntity.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public static final String DATABASE_NAME="AppDatabase";
private static volatile AppDatabase instance;
private static final Object Lock=new Object();
public abstract ProductDAO productDAO();
public static AppDatabase getInstance(Context context){
if(instance==null){
synchronized (Lock){
if(instance==null){
instance= Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class,DATABASE_NAME).build();
}
}
}
return instance;
}
}
这是我处理数据库的活动:
private AppDatabase mDb;
private ProductDAO mDao;
mDb= AppDatabase.getInstance(this);
mDao=mDb.productDAO();
Log.v("this","dbCreated");
///////////one product
ProductEntity product1=new ProductEntity(1,"prod1","2500");
Completable.fromAction(() ->mDao.insert(product1))
.subscribeOn(Schedulers.io())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
Log.v("this","error0 "+ e.getMessage() );
}
});
/////List of Products
List<ProductEntity>productList=new ArrayList<>();
productList.add(new ProductEntity("prod2","3500"));
productList.add(new ProductEntity("prod3","4500"));
productList.add(new ProductEntity("prod4","5500"));
Completable.fromAction(() ->mDao.insertAll(productList))
.subscribeOn(Schedulers.io())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
Log.v("this","error1 "+ e.getMessage() );
}
});
//getList of products
mDao.getAllRXjava()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<ProductEntity>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(List<ProductEntity> productEntities) {
for (int i=0;i<productEntities.size();i++){
Log.v("this",productEntities.get(i).getName());
}
}
@Override
public void onError(Throwable e) {
Log.v("this","error "+ e.getMessage() );
}
});
}
下面是发生的情况,当我第一次启动我的activity类时,没有发生错误,当我从emulator下载创建的数据库并在sqlite数据库管理器中打开它时,问题是文件是空的,没有创建数据库
当我回去重新打开数据库时,我得到了很多错误:
Cannot run invalidation tracker. Is the db closed?
java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:752)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:45)
at android.arch.persistence.room.InvalidationTracker$1.run(InvalidationTracker.java:321)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
你能帮助我吗?我的代码怎么了?
早些时候,我也有同样的问题。房间的数据库文件没有显示任何数据。它有数据,因为我可以记录它,但一旦我从android studio中取出它,你就无法在sql浏览器中打开它。
你应该试着在某个地方记录数据,检查阉羊它工作正常。在我的情况下,它工作正常,所以我继续前进。
我在房间数据库中使用MVVM架构模式,当使用Livedata和update row时,它会立即显示recylerview中的更改。 但是我想在mvvm中使用Rxjava而不是livedata来显示数据和更改,但是当更新一行时,它不会立即在recyclerview中显示更改。这是我的代码: 道 LessonRepository 视图模型 获取片段中列表的方法 更新行的方法 我应该做什么,我应该修复哪
我是一个拥有ROOM,RXJava和Android的新手。 在Android应用程序测试中,REST服务检索用户列表。如果用户已经存在,则必须修改此列表。如果该用户不存在,则将该用户插入到数据库中。如果用户已经存在,则不插入该用户。 在活动中的验证如下: Iserdao consiste en lo Siguiente: El UserRepository contiene lo siguient
试图学习房间和RXJAVA。我已经理解了大约80%的内容,但我仍然无法弄清楚其余的内容。 这是我在插入数据时得到的错误。 Java语言lang.NullPointerException:尝试调用接口方法“void com”。实例学习室。实体道。在空对象引用上插入(com.example.learnroom.Entitys)“” 如果我不运行try catch,我会得到以下错误,这似乎是相关的。 J
在这种情况下,我希望返回,但当我执行代码时,它会引发一个异常,并带有以下消息: 提供的值为空 我不能使用,因为Dao返回的是,所以应该返回相同的类型。 在不改变DAO的情况下,如何检查用户是否存在?
我在Livedata上使用了Room和RxJava,但它不起作用<我试了两种方法。我不知道为什么第二个有效,为什么第一个无效。 (1)按单条获取列表- 道 ViewModel我使用了Repository模式(dao的返回类型和Repository的返回类型相同) 碎片 它在创建片段时工作,但数据在更改时不更新。 道 视图模型 碎片 当数据发生变化时,它工作得很好。 我期待你的建议。 请让我知道,如
因此,我使用LiveData和ViewModel设置获取和插入数据的功能,并使用Room数据库保存数据。 将数据插入数据库后,我的RecyclerView不会更新数据。 RecyclerAdapterTransaksi.kt 使用RecyclerView显示数据库数据的片段 Pemasukkanframent。kt 使用LiveData的ViewModel类 TransaksiViewModel.