首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在安卓中使用RxJava2插入到SQLiteDatabase中

在安卓中使用RxJava2插入到SQLiteDatabase中
EN

Stack Overflow用户
提问于 2018-06-18 20:58:55
回答 1查看 996关注 0票数 2

我正在学习安卓中的RxJava2。有人能解释一下如何使用RxJava2将数据插入到SQLiteDatabase中吗?这里是我试图使用的代码示例,但它将数据插入数据库六次;

//OnClick

代码语言:javascript
复制
getCompletableObservable()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(getCompletableObserver());

//可观察性

代码语言:javascript
复制
private Completable getCompletableObservable(){
    return Completable.create(new CompletableOnSubscribe() {
        @Override
        public void subscribe(CompletableEmitter emitter) throws Exception {
            addData();
            if(!emitter.isDisposed())
                emitter.onComplete();
        }
    });
}

//观察者

代码语言:javascript
复制
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方法

代码语言:javascript
复制
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){

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 03:31:30

使用Room Persistence library。创建它是为了简化与数据库的交互。它支持使用RxJava和LiveData包装数据。

检查the Documentation以开始

基本上,您希望创建实体类,该实体类将抽象表并表示单个行对象。例如,将名为users的表的用户实体和uid显示为PK。

代码语言:javascript
复制
@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类。您将使用此接口的对象进行实际查询。房间将为您创建具体的类

代码语言:javascript
复制
@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的方法,您可以随心所欲地命名这些方法。

代码语言:javascript
复制
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

现在假设我

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50910101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档