Как ускорить вставку Room DB? - PullRequest
0 голосов
/ 20 апреля 2019

Я вставляю только 1000 объектов в базу данных комнат с помощью Rx-Android, но это занимает не менее 7 минут.Как я могу сделать это быстрее?

Я использую модификацию для извлечения данных с сервера с подкачкой и использую zip-оператор RxJava для параллельного извлечения данных.Я получаю все данные в течение 24 секунд, но пока я вставляю их в Room DB, их вставка занимает не менее 7 минут, а иногда и более 10 минут.Я пытался вставить все 1000 объектов вместе, по 100, а также по одному, но каждый раз получал один и тот же результат.Я прочитал статью о задержке вставки и обнаружил, что для 1000 объектов это занимает до 64 секунд.

Объект GroupA

@Entity(tableName = "group_a")
public class GroupA {

    @Expose
    @PrimaryKey
    @NonNull
    private String _id;
    @Expose
    @TypeConverters(AbracketseConverter.class)
    private List<Abracketse> abracketses;
    @Expose
    private String createdate;
    @Expose
    private String group;
    @Expose
    private String headercolumna;
    @Expose
    private String headercolumnb;
    @Expose
    @TypeConverters(StringConverter.class)
    private List<String> morelist;
    @Expose
    private Long sequence;
    @Expose
    private String subheader;
    @Expose
    private String updatedate;
}

Abracketse

public class Abracketse {

    @Expose
    private String columna;
    @Expose
    private String columnb;
    @Expose
    private String columnc;
    @Expose
    private String columnd;
    @Expose
    private String columne;
    @Expose
    private String columnf;
    @Expose
    private String columng;
}

База данных помещения

@Database(entities = {
        RecentSearchModel.class,
        Calculator.class,
        GroupA.class,
        GroupB.class
}, version = 2, exportSchema = false)
public abstract class MyRoomDatabase extends RoomDatabase {

    public abstract SearchDAO searchDAO();
    public abstract CalculatorDAO calculatorDAO();
    public abstract GroupADAO groupADAO();
    public abstract GroupBDAO groupBDAO();

}

GroupA DAO

@Dao
public interface GroupADAO {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Completable insertAllGroupA(List<GroupA> groupAList);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertGroupA(GroupA groupA);

    @Query("SELECT * FROM group_a")
    Single<List<GroupA>> getAllGroupA();

}

Экземпляр комнаты из класса приложения

public static MyRoomDatabase getDatabase() {
        if (DB_INSTANCE == null) {
            synchronized (MyRoomDatabase.class) {
                if (DB_INSTANCE == null) {
                    DB_INSTANCE = Room.databaseBuilder(context,
                            MyRoomDatabase.class, "my_database")
                            .fallbackToDestructiveMigration()
                            .build();
                }
            }
        }
        return DB_INSTANCE;
    }

Выборка данных с сервера и их объединение

 APIs apIs = RetroCliet.getClient();
        List<Observable<List<GroupA>>> observableRequestList = new ArrayList<>();
        for (int i = 0; i < 11; i++) {
            observableRequestList.add(apIs.getGroupAMedicineList(new MedDataFetchBody(i)).subscribeOn(Schedulers.io()));
        }
        List<GroupA> result1 = new ArrayList<>();
        Observable<List<GroupA>> result = Observable.zip(observableRequestList, objects -> {
            for (Object object : objects) {
                for (Object childObject : (List<GroupA>) object) {
                    result1.add((GroupA) childObject);

                }
            }
            return result1;
        });

        result.observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new Observer<List<GroupA>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        disposable.add(d);
                    }
                    @Override
                    public void onNext(List<GroupA> groupAS) {

                    }
                    @Override
                    public void onError(Throwable e) {
                        CustomDialog.dismissDialog();
                        reTryDialouge();
                    }
                    @Override
                    public void onComplete() {
                        insertToDB(result1);
                    }
                });

Вставка данныхв комнату

 Completable.fromAction(() -> MyApplication.getDatabase().groupADAO().insertAllGroupA(groupAS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new CompletableObserver() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        disposable.add(d);
                    }
                    @Override
                    public void onComplete() {

                    }
                    @Override
                    public void onError(Throwable e) {
                        CustomDialog.dismissDialog();
                    }
                }));

Где моя вина?Как я могу улучшить это?Как я могу ускорить операцию вставки?

...