【问题标题】:Insert into SQLiteDatabase using RxJava2 in Android在 Android 中使用 RxJava 插入 SQLite 数据库
【发布时间】:2018-06-19 17:38:16
【问题描述】:

我正在学习 Android 中的 RxJava2。谁能解释一下我们如何使用 RxJava2 将数据插入 SQLiteDatabase。 这是我尝试使用的代码示例,但它将数据插入数据库六次;

//点击

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()+"");
        }
    };
}

//添加方法

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){

    }

【问题讨论】:

    标签: android rx-java2 rx-android


    【解决方案1】:

    使用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&lt;User&gt;,但 Room 允许您使用 RxJava Observables 包装它们,例如 Flowable&lt;List&lt;User&gt;&gt; 或架构组件 livedata LiveData&lt;List&lt;User&gt;&gt;

    要使用 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"
    }
    

    【讨论】:

    • 感谢 Stefano 的回答。我去看看。
    • 我已经扩展了一些修改和注释的示例
    • 这些注释应用需要哪些依赖项。
    • 很高兴能提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多