Оптимизация вставок SQLite
У меня есть эта функция ниже, которая работает нормально:
Я использую его, потому что в процессе синхронизации мне приходится вставлять много строк (иногда более 30 000 в одной и той же синхронизации) в разные таблицы, а для некоторых из них значение, полученное из моего Json
объект не настоящий. Поэтому, прежде чем вставить строку, я должен заменить значение другим. Вот почему я использую эту функцию:
public void myFunction( String tableName, String attrName, ContentValues currentVal ) {
SQLiteDatabase database = this.getReadableDatabase();
long realValue = -1;
Cursor c = database.rawQuery("SELECT value FROM "+tableName+" WHERE "+tableName+".other_value = " + currentVal.getAsString(attrName), null);
if( c.moveToFirst() ) {
realValue = c.getLong(0);
}
if( c != null ) c.close();
currentVal.put( attrName, realValue );
}
Моя проблема заключается в Cursor
... c.moveToFirst()
Функция влияет на скорость процесса.
Я проводил исследования и нашел так много объяснений, как:
Я указываю, что использую индексы и уже пробую транзакции.
Итак, что я хотел сделать сейчас (или узнать): Есть ли способ выполнить что-то вроде:
currentVal.put( attrName, SELECT value FROM "+tableName+" WHERE "+tableName+".other_value = " + currentVal.getAsString(attrName) );
Потому что с этим трюком мне не придется повторяться в моем Cursor
(что на самом деле моя проблема) и когда я буду вставлять содержимое ContentValues
он автоматически обработает подзапрос, чтобы получить реальное значение для вставки.
Я также думал о создании временной таблицы. Я вставляю ценности, основанные на моем Json
объект, не меняя их, и когда я вставил все значения для текущей таблицы, я скопировал их в реальную таблицу, в то же время выполнив подзапрос для повторного размещения неправильных значений на правильные.
Любые идеи, предложения, фрагменты,... будут оценены