我正在学习安卓中的RxJava2。有人能解释一下如何使用RxJava2将数据插入到SQLiteDatabase中吗?这里是我试图使用的代码示例,但它将数据插入数据库六次;
//OnClick
getCompletableObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getCompletableObserver());
//可观察性
private Completable getCompletableObservable(){
return Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
addData();
if(!emitter.isDisposed())
emitter.onComplete();
}
});
}
//观察者
CompletableObserver getCompletableObserver(){
return new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
showMessage("Student Added Sucessfully");
}
@Override
public void onError(Throwable e) {
showMessage(e.getMessage()+"");
}
};
}
//Add方法
try {
DatabaseHelper db = new DatabaseHelper(DemoRxJava.this);
db.open();
String c = db.AddData(new Student(random.nextInt(1000)+"",SName.getText().toString(),SContact.getText().toString(),SEmail.getText().toString()));
Log.d("StudentData",c);
db.close();
}catch (Exception e){
}
发布于 2018-06-19 03:31:30
使用Room Persistence library。创建它是为了简化与数据库的交互。它支持使用RxJava和LiveData包装数据。
检查the Documentation以开始
基本上,您希望创建实体类,该实体类将抽象表并表示单个行对象。例如,将名为users
的表的用户实体和uid显示为PK。
@Entity(tableName="users")
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
然后定义包含查询定义的DAO类。您将使用此接口的对象进行实际查询。房间将为您创建具体的类
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
最后,您创建了数据库对象,您将使用该对象来实际查询数据库。这个类是抽象的,Room还将为您创建具体的类。它包含创建DAO的方法,您可以随心所欲地命名这些方法。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
现在假设我
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "databaseName.db").build(); //Most of the time I have used this, it is a Singleton.
List<User> users = db.userDao().getAll();
for(User u : users)
{
Log.d("SQLITE_ROOM_DATA", u.firstName);
}
在这里,我们返回了简单的List<User>
,但Room允许您使用RxJava可观察对象(如Flowable<List<User>>
或架构组件livedata LiveData<List<User>>
)对它们进行包装
要使用Room,您需要将依赖项添加到gradle,如下所示:
dependencies {
def room_version = "1.1.0" // or, for latest rc, use "1.1.1-rc1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
https://stackoverflow.com/questions/50910101
复制相似问题