Уникальные объекты-контейнеры Realm

Я реализовал синхронизацию в реальном времени после демонстрационного приложения задач Realm.

Там используется фиктивный контейнер для хранения List с моделями.

Демонстрационное приложение, похоже, не поддерживает автономное использование.

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

Первоначально я ожидал, что закончу с двумя контейнерами (что было бы недопустимым состоянием), но когда я тестировал, к удивлению, в конце был только 1 контейнер.

Но иногда я получаю 2 контейнера и не могу определить причину этого.

Тогда возникает вопрос, как именно это работает? Я предполагаю, что причина того, что контейнер обычно не дублируется при первой синхронизации автономного устройства, заключается в том, что он обрабатывается как один и тот же объект, может быть, потому, что у него нет первичного ключа или что-то в этом роде? Но тогда почему он иногда дублируется? И что было бы лучшей практикой здесь? Возможно, мне придется использовать первичный ключ или проверить после подключения, есть ли дублирование, и если да, то выполнить ручное слияние контейнеров?


person User    schedule 04.02.2017    source источник


Ответы (1)


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

Добавление первичного ключа определенно поможет, поскольку это означает, что если второй список будет создан локально, он будет объединен с версией, полученной с сервера.

Недавно мы сосредоточились на процессе «подключения», когда второе устройство подключается к учетной записи пользователя Realm Mobile Platform через новую систему уведомлений о прогрессе. Более логичным подходом было бы дождаться завершения синхронизации начальной загрузки после входа в систему, а затем проверить наличие объектов. Как только документация будет завершена, мы, скорее всего, изменим то, как Realm Tasks справляется с этим.

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

Мы планируем создать функцию «анонимный пользователь», с помощью которой пользователь может сразу начать использовать приложение (даже в автономном режиме), а затем любые изменения, которые они сделали до входа в систему (из-за того, что они не в сети), затем переносятся в учетную запись пользователя после они так и делают.

person TiM    schedule 08.02.2017
comment
Спасибо! Исправление, похоже, заключается в добавлении первичного ключа. Интересно, почему слияние работает в большинстве случаев без него. Может быть, есть внутренний идентификатор объекта, который используется аналогично первичному ключу? - person User; 10.02.2017