Автономная синхронизация мобильных служб Android Azure Мягкое удаление

Я реализовал приложение для Android, которое поддерживает мобильные службы Azure и автономную синхронизацию. Я тестировал его на двух разных устройствах. Я выполняю операцию удаления (мягкое удаление) на первом устройстве, и все работает нормально. Затем я разрешаю ему синхронизироваться, проверяю запись на стороне сервера, что в столбце «Удалено» помечено значение «истина», что и происходит. Но мне кажется, что мне не удается синхронизировать второй планшет, чтобы отразить новые изменения, то есть не отображать удаленную запись.

Чтобы включить мягкое удаление, я добавил enableSoftDelete: true в контроллеры таблиц в службе приложений в Azure. Я не касался своего приложения с точки зрения процесса удаления, но ниже приведено типичное удаление:

    Save save = getSave(SaveID);
try {
            mtblSave.delete(save);
            return true;

        } catch (Exception exception) {
            exception.printStackTrace();
            return false;
        }

Я использую серверную часть .NET с Azure SQL Server.

Любые идеи?

заранее спасибо


person SliderUK    schedule 16.08.2017    source источник


Ответы (1)


Но мне кажется, что мне не удается синхронизировать второй планшет, чтобы отразить новые изменения, то есть не отображать удаленную запись.

Как Использование мягкого удаления в мобильных службах упоминается следующее:

При использовании Автономная синхронизация данных для мобильных служб, клиентский SDK автоматически запрашивает удаленные записи и удаляет их из локальной базы данных. Если не включено мягкое удаление, вам нужно написать дополнительный код на серверной части, чтобы клиентский SDK знал, какие записи следует удалить из локального хранилища. В противном случае локальное хранилище клиента и серверная часть будут несовместимы в отношении этих удаленных записей, и для очистки локального хранилища необходимо вызвать метод клиента PurgeAsync().

Я предположил, что вы можете использовать fiddler для захвата сетевых трассировок при обработке операции извлечения. Кроме того, вы можете добавить includeDeleted при построении запроса для извлечения данных, как показано ниже, для лучшего понимания этой функции.

var pullQuery = mClient.getTable(ToDoItem.class).where().field("complete").eq(false).includeDeleted();
mToDoTable.pull(mPullQuery).get();

Кроме того, для получения дополнительных сведений об использовании автономной синхронизации данных в мобильных службах вы можете обратиться к здесь.

ОБНОВЛЕНИЕ:

Параметр запроса - это необязательный запрос для фильтрации результатов.

Как Как автономная синхронизация работает, упоминается о добавочной синхронизации:

Если вы используете значение queryId, отличное от NULL, пакет SDK для мобильных устройств Azure выполняет инкрементную синхронизацию. Каждый раз, когда операция извлечения возвращает набор результатов, последняя метка времени updatedAt из этого набора результатов сохраняется в локальных системных таблицах SDK. Последующие операции извлечения извлекают только записи после этой отметки времени.

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

Вы можете обратиться к этому ответу и устраните вашу проблему.

person Bruce Chen    schedule 17.08.2017
comment
Я действительно думаю, что нашел проблему. Я изменил свой метод синхронизации с mtblSave.pull(null, "tblsave").get(); на mtblSave.pull(null).get();, и он перетащил все измененные записи. Код, который не работал, был для инкрементальной синхронизации, которая, как я думал, сработает. Есть ли проблема с моим кодом инкрементальной синхронизации? Нужно ли мне на самом деле задавать вопрос? - person SliderUK; 17.08.2017
comment
Я обновил свой ответ, вы можете обратиться к объяснению. - person Bruce Chen; 17.08.2017
comment
Привет, спасибо, но я не совсем понимаю ту часть, которую вы выделили жирным шрифтом. Использование mtblSave.pull(null, "tblsave").get(); - это не уникальный идентификатор запроса 'tblSave', поэтому при повторном вызове он проверит updatedAt? В чем разница между методом, который я использовал, и методом, упомянутым в вашем другом ответе await coffeeTable.PullAsync("allCoffees", coffeeTable.CreateQuery());? - person SliderUK; 17.08.2017
comment
Код из другого выпуска написан на C #. Первый параметр - это queryid, второй - это запрос. Я предположил, что структура таблицы для хранения последнего обновления с отметкой времени такая же. Ваш код выглядит хорошо, но, поскольку вы сказали, что инкрементная синхронизация не может работать как исключение, я просто добавляю несколько примечаний и подходов, чтобы вы могли найти эту проблему. - person Bruce Chen; 17.08.2017
comment
Я начал использовать отладку мобильных служб Azure, и исходящий запрос выглядит следующим образом https://[APPNAME].azurewebsites.net/tables/tblsave?$filter=updatedAt%20ge%20(datetimeoffset%272017-08-16T16:17:11.516Z%27)&$top=50&$orderby=updatedAt%20asc. Теоретически это должно получать записи позже 16 августа 17:00, время 16:17, верно? Определенно есть записи, которые новее, но я ничего не верну. Любые идеи? - person SliderUK; 18.08.2017
comment
Думаю, я понял. Ваш запрос на включение удаления по какой-то причине ничего не делал, поэтому я немного его изменил и считаю, что теперь работает мягкое удаление и инкрементная синхронизация. Таким образом, запрос синхронизации был mtblSave.pull(null, "tblsave").get();, а он изменился на Query pullQuery = QueryOperations.field("Id").ne(val("")).includeDeleted(); mtblSave.pull(pullQuery, "tblsave").get();. Не думайте, что получение всех записей путем запроса ненулевых значений Id является правильным способом. Есть ли другой способ сделать это? - person SliderUK; 18.08.2017
comment
Итак, ваш ответ о добавлении includeDeleted был правильным, поэтому я приму это как ответ. - person SliderUK; 18.08.2017