У меня есть собственный Android ContentProvider
, который хранит и извлекает данные из базы данных SQLite.
Предположим, что в одной из таблиц БД есть столбец _ID
и столбец NAME
и такой контент:
|==========|==========|
| _ID | NAME |
|==========|==========|
| 1 | d1 |
| 2 | d2 |
| 3 | d3 |
| 4 | d4 |
|==========|==========|
Эта база данных SQLite синхронизируется с удаленной базой данных. и новые данные периодически загружаются по сети.Возможные операции над таблицей:
Давайте теперь предположим, что все возможные операции выполняются сразу и, после извлечения некоторых актуальных данных с удаленного сервера, новое содержимое этой таблицы должно быть установлено следующим образом:
|==========|==========|
| _ID | NAME |
|==========|==========|
| 1 | d7 |
| 3 | d3 |
| 4 | d6 |
| 5 | d5 |
|==========|==========|
Для этого может быть два разных подхода:
УДАЛИТЬ
SQL-командой, а затем добавить все строки, полученные с сервераВ настоящее время на Android я реализую второй метод с пакетными операциями чтобы максимизировать производительность:
final ArrayList operations = new ArrayList();
// with this URI, the content provider deletes all rows
operations.add(ContentProviderOperation.newDelete(Users.CONTENT_URI).build());
final ContentValues values = new ContentValues();
values.put(ID_COLUMN, 1);
values.put(NAME_COLUMN, "d7");
values.put(ID_COLUMN, 3);
values.put(NAME_COLUMN, "d3");
values.put(ID_COLUMN, 4);
values.put(NAME_COLUMN, "d6");
values.put(ID_COLUMN, 5);
values.put(NAME_COLUMN, "d5");
operations.add(ContentProviderOperation.newInsert(Users.CONTENT_URI).withValues(values).build());
getApplicationContext().getContentResolver().applyBatch(MyContentProvider.AUTHORITY, operations);
Это лучший подход или d 1 (или какой-либо другой метод) лучше с точки зрения производительности?
РЕДАКТИРОВАТЬ: например, используя подход 2, переопределенный ContentProvider#bulkInsert
, который использует транзакции базы данных, может ускорить операцию пакетной вставки. много: см. этот вопрос .