Я вставляю только 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();
}
}));
Где моя вина?Как я могу улучшить это?Как я могу ускорить операцию вставки?