当前位置: 首页 > 知识库问答 >
问题:

在Android中使用RxJava2插入SQLiteDatabase

长孙明知
2023-03-14

我正在android中学习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()+"");
        }
    };
}

//添加方法

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

    }

共有1个答案

唐弘益
2023-03-14

使用房间持久性库。创建它是为了简化与数据库的交互。它支持使用RxJava和LiveData包装数据。

检查文档以开始

基本上,您希望创建将抽象您的表并表示单行对象的Entity类。例如,这将为名为user的表显示user Entity,并将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);
}

这里我们返回了简单的列表

要使用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"
}
 类似资料:
  • Learning RxJava 2 for Android by example Take the MindOrks Android Online Course and Learn RxJava How to use RxJava 2 in Android Application How to migrate from RxJava 1.0 to RxJava 2.0 How to use RxJ

  • 问题内容: 我想将imageview放在edittext内。这有没有可能?我检查了“ evernote”应用程序,它能够将照片放在edittext部分上。我想使我的应用程序完全一样。如何放置从图库中选择的imageview并将照片放置在edittext中? 我首先尝试将imageview放在.xml文件的relativelayout内,但是这给我带来了一个错误标志。 我应该在.xml文件上执行吗?

  • 何时调用subscribeWith方法而不是普通的Subscribe?用例是什么? VS 谢谢你 根据文档,这两个实例都返回一次性的SingleObserver实例: 其中ConsumerSingleObserver类实现SingleObserver和Disable。

  • 我使用REST API查询Person对象列表。最大限制是100人响应。我需要把所有的人都叫来,总数不详。第一个响应中有一个名为“next”的字段,包含下一页的url。我需要使用rxjava/rxandroid和referfit链接这些调用,直到最后一个响应有一个空的“next”字段。由于“Next”字段包含分页url,所有后续调用都将具有与第一个不同的url。做这件事最方便的方法是什么?

  • 问题内容: 我有对象的arraylist,并尝试将列表插入HANA。所以我的插入代码看起来像 } 这里 返回一个整数数组。 但这无法正常工作。根据我的程序每次都会调用ARRAY函数,但是为什么不将其插入HANA数据库中呢,所以过了一会儿我才知道我必须将JAVA Array转换为HANA Array。如何转换Java Array到HANA阵列。任何帮助表示赞赏。 问题答案: @RKR好的,这里有您的

  • 我是卡桑德拉的新人。我必须使用c#在卡桑德拉中一次性插入50000行。我正在使用卡桑德拉c#驱动程序。我正在使用以下代码在卡桑德拉中插入数据。请帮帮我 我收到错误:批处理中的语句无效:只允许UPDATE、INSERT和DELETE语句。