房间数据库。插入成功但找不到数据
Room Database. Insert sucessfull but no data found
我有一个简单的 Room 数据库设置,如下所示:
实体Class
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
public User(int uid, String firstName, String lastName){
this.uid = uid;
this.firstName = firstName;
this.lastName = lastName;
}
}
My Dao 接口:
@Dao
public interface UserDao {
@Query("SELECT * FROM User")
Flowable<List<User>> getAlls();
@Insert
Completable addData(User modelClass);
}
我的数据库:
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
static AppDatabase getDatabase(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, AppDatabase.class, "your_db_name").createFromFile(new File("mypath")).build();
}
return instance;
}
public abstract UserDao userDao();
}
最后是我的 ViewModel:
public class RoomWithRxJavaViewModel extends AndroidViewModel {
private AppDatabase appDatabase;
public RoomWithRxJavaViewModel(@NonNull Application application) {
super(application);
appDatabase = AppDatabase.getDatabase(application);
}
public Flowable<List<User>> getList() {
return appDatabase.userDao().getAlls().subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread());
}
public Completable addData(User modelClass) {
return Completable.fromAction(() -> appDatabase.userDao().addData(modelClass))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
还有我的 Activity 我打印结果的地方:
RoomWithRxJavaViewModel viewModel = new RoomWithRxJavaViewModel(this.getApplication());
Disposable disposable = viewModel.addData(new User(2, "btt", "bbb"))
.subscribe(
() -> { //onSucess
Toast.makeText(this, "Completed!", Toast.LENGTH_SHORT).show();
Disposable subscribe = viewModel.getList()
.subscribe(modelClasses ->
{
Toast.makeText(this, "RoomWithRx: " + modelClasses.size(), Toast.LENGTH_LONG).show();
}, e -> Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show());
}, //onError
throwable -> {
Toast.makeText(this, "Error!" + throwable.getMessage(), Toast.LENGTH_SHORT).show();
}
);
正如您从代码中看到的,我首先尝试在我的数据库中创建一个默认用户。
如果插入成功,这是因为我总是进入 onSucess 函数,我想检查更新后的用户的大小 Table,这里是陷阱:
无论我使用代码插入用户的频率如何,大小始终保持为 0。
我是不是漏掉了什么?
你的 DAO:
@Insert
Single<Long> insert(User user);
将 Completable 更改为 Single,如下所示:
public Single<Long> addData2(User user) {
return appDatabase.userDao().addData(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
您的模型视图应如下所示:
Disposable subscribe1 = viewModel.addData2(new User(4, "some", "user"))
.subscribe(
id -> { //onSucess },
throwable -> { //onerror }
);
我有一个简单的 Room 数据库设置,如下所示:
实体Class
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
public User(int uid, String firstName, String lastName){
this.uid = uid;
this.firstName = firstName;
this.lastName = lastName;
}
}
My Dao 接口:
@Dao
public interface UserDao {
@Query("SELECT * FROM User")
Flowable<List<User>> getAlls();
@Insert
Completable addData(User modelClass);
}
我的数据库:
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
static AppDatabase getDatabase(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, AppDatabase.class, "your_db_name").createFromFile(new File("mypath")).build();
}
return instance;
}
public abstract UserDao userDao();
}
最后是我的 ViewModel:
public class RoomWithRxJavaViewModel extends AndroidViewModel {
private AppDatabase appDatabase;
public RoomWithRxJavaViewModel(@NonNull Application application) {
super(application);
appDatabase = AppDatabase.getDatabase(application);
}
public Flowable<List<User>> getList() {
return appDatabase.userDao().getAlls().subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread());
}
public Completable addData(User modelClass) {
return Completable.fromAction(() -> appDatabase.userDao().addData(modelClass))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
还有我的 Activity 我打印结果的地方:
RoomWithRxJavaViewModel viewModel = new RoomWithRxJavaViewModel(this.getApplication());
Disposable disposable = viewModel.addData(new User(2, "btt", "bbb"))
.subscribe(
() -> { //onSucess
Toast.makeText(this, "Completed!", Toast.LENGTH_SHORT).show();
Disposable subscribe = viewModel.getList()
.subscribe(modelClasses ->
{
Toast.makeText(this, "RoomWithRx: " + modelClasses.size(), Toast.LENGTH_LONG).show();
}, e -> Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show());
}, //onError
throwable -> {
Toast.makeText(this, "Error!" + throwable.getMessage(), Toast.LENGTH_SHORT).show();
}
);
正如您从代码中看到的,我首先尝试在我的数据库中创建一个默认用户。
如果插入成功,这是因为我总是进入 onSucess 函数,我想检查更新后的用户的大小 Table,这里是陷阱: 无论我使用代码插入用户的频率如何,大小始终保持为 0。
我是不是漏掉了什么?
你的 DAO:
@Insert
Single<Long> insert(User user);
将 Completable 更改为 Single,如下所示:
public Single<Long> addData2(User user) {
return appDatabase.userDao().addData(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
您的模型视图应如下所示:
Disposable subscribe1 = viewModel.addData2(new User(4, "some", "user"))
.subscribe(
id -> { //onSucess },
throwable -> { //onerror }
);