2017-02-14 22 views
0

я соединяли список в Realm БД какREALM MOBILE ПЛАТФОРМА проблемы синхронизации разрешение

ABCD

Каждый элемент является Realm объект как

{имя, следующий пункт}

Так что, если я меняю список на устройстве 1 в автономном режиме до

ACBD

и устройства 2

ADBC ​​

и синхронизации после того, что я получаю синхронизируются DB, но неправильно циклическое лист

A -> D -> B -> D .....

Как я могу решить эту проблему?

Есть ли возможность получить синхронизированные объекты после синхронизации на клиентах и ​​исправить списки до области? Результаты будут запущены?

Обновление.

Я также попытался использовать такую ​​модель для иерархических списков

class MList: Object { 
    dynamic var name = "" 
    let items = List<MItem>() 
} 

class MItem: Object { 
    dynamic var name = "" 
    let subitems = List<MItem>() 
} 

Я использовал данные

A 
B 

1. 
A 
-B 

2. 
B 
-A 

После синхронизации, но список потерял все элементы. Поэтому такая структура данных не подходит для моей задачи.

ответ

0

Можете ли вы использовать собственные списки Realm? Они имеют довольно сложную логику слияния, которая поддерживает элемент перемещается/переста-: https://realm.io/docs/javascript/latest/#list-properties

+0

Да для плоских списков интегрированные списки в области работают хорошо. Синхронизация происходит без проблем. Но у меня есть иерархические списки в моем приложении. В этом случае возникают те же проблемы. Мне нужно создать логику постсинхронизации перед уведомлениями об обновлениях. –

+0

Иерархический список часто называют деревом:) Если вы объясните свою модель данных, мы можем попытаться поместить ее в структуры данных Realm. –

+0

Теперь у меня есть такая модель ' class MList: Object { dynamic var name =" " dynamic var firstItem: PLItem? } ' класса MITEM: Object { динамического имя вара = "" динамических переменных следующий: PLItem? динамический список переменных: PLList? динамический var parent: PLItem? } –

0

Теперь у меня есть модель

class MList: Object { 
    dynamic var name = "" 
    dynamic var firstItem: PLItem? 
} 

class MItem: Object { 
    dynamic var name = "" 
    dynamic var next: PLItem? 
    dynamic var parent: PLItem? 
} 

Я использую «Далее», чтобы заказать список и «родитель», чтобы создать дерево структура.

+0

Означает ли это, что вам удалось решить вашу проблему? – teotwaki

+0

Нет, это ответ @VictorGrishchenko. Я новичок в stackoverflow, поэтому мой ответ не достаточно чист. –

+0

Не публикуйте ответы, чтобы получить дополнительную информацию. Или отредактируйте исходное сообщение, либо напишите комментарий. – teotwaki

3

Хорошо, я вижу проблему.

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

Вместо этого я предлагаю вам использовать встроенный тип списка Realm, который будет сливаться правильно. У вас все еще будет проблема, связанная с полем parent в вашей модели данных, в результате чего, если два участника изменят значение, последний из них будет «выиграть». Я не уверен, что ваш конкретный случай использования, так что это может быть или не совсем нормально. В частности, это будет не очень хорошо, если вы выполняете вращение деревьев, и в этом случае вы закончите утечку объектов из графика или создание неожиданных циклов.

Лучшим долгосрочным решением для Realm является введение правильного типа дерева CRDT, но пока этого не было. Если деревья являются фундаментальным требованием в вашей модели данных, я предлагаю создать запрос функции для деревьев CRDT в our GitHub repository.

+0

Я считаю, что разрешение конфликтов вручную является более универсальным способом работы с проблемами синхронизации. Я получил ответ на свой вопрос в [link] (https://forums.realm.io/t/sync-tree-structures/122) с примером разрешения конфликтов вручную. Но есть ли способ получить список синхронизированных объектов в функции разрешения конфликтов вручную? Потому что проверка всей базы данных слишком дорога. –

+0

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

+0

Realm Mobile Platform в настоящее время полагается на автоматическое разрешение конфликтов, чтобы включить автономный режим. Ручное разрешение конфликтов может быть добавлено в будущем, но оно не согласуется с автономной работой, поскольку каждый участник больше не может договориться о том, как разрешить конфликт. Вместо этого мы выступаем за выражение желаемого поведения в модели данных, так что автоматическое разрешение конфликтов знает, что нужно делать правильно. В нашей документации есть немного информации об этом: https://realm.io/docs/realm-object-server/#conflict-resolution –