Рекомендации по синхронизации базы данных SQL с удаленным сервером REST на Android

У меня есть собственный Android ContentProvider, который хранит и извлекает данные из базы данных SQLite.

Предположим, что в одной из таблиц БД есть столбец _ID и столбец NAME и такой контент:

|==========|==========|
|   _ID    |   NAME   |
|==========|==========|
|    1     |    d1    |
|    2     |    d2    |
|    3     |    d3    |
|    4     |    d4    |
|==========|==========|

Эта база данных SQLite синхронизируется с удаленной базой данных. и новые данные периодически загружаются по сети.Возможные операции над таблицей:

  1. Существующие строки могут быть удалены
  2. Новые строки могут быть добавлены
  3. Столбец NAME существующих строк может быть изменен

Давайте теперь предположим, что все возможные операции выполняются сразу и, после извлечения некоторых актуальных данных с удаленного сервера, новое содержимое этой таблицы должно быть установлено следующим образом:

|==========|==========|
|   _ID    |   NAME   |
|==========|==========|
|    1     |    d7    |
|    3     |    d3    |
|    4     |    d6    |
|    5     |    d5    |
|==========|==========|

Для этого может быть два разных подхода:

  1. Запрос к базе данных и проверьте все существующие строки, чтобы увидеть, нужно ли их обновлять, затем добавьте любые новые строки и удалите все отсутствующие строки - хотя этот метод может быть немного сложным, если мы хотим обновить базу данных с помощью разбиения на страницы, а не с помощью одного сетевая выборка
  2. Удалить всю таблицу одной УДАЛИТЬ 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, который использует транзакции базы данных, может ускорить операцию пакетной вставки. много: см. этот вопрос .

8
задан Community 23 May 2017 в 12:22
поделиться