Мне нужно предварительно выделить краткие целые первичные ключи (из непрерывного диапазона) для моих синхронизированных клиентов базы данных.
Вариант использования довольно прост: мне нужно распечатать билеты с короткими серийными номерами в ситуации, когда мобильные клиенты имеют прерывистое соединение. Номера должны быть достаточно короткими, чтобы их можно было прочитать через плохую систему громкой связи в шумной обстановке, чтобы получить призы за дверь.
Realm идеально подходит для этой задачи, но мне нужно позволить каждому клиенту предварительно выделить себе пул гарантированно-уникальных серийных номеров, когда они подключены к серверу, чтобы они могли печатать билеты позже, даже в автономном режиме.
class TicketNumber extends RealmObject {
@PrimaryKey int serialNumber;
String clientId; // instance identifier unique to each client
}
Мое намерение состоит в том, чтобы клиент A выполнил транзакцию для создания набора объектов TicketNumber
, начиная с max(serialNumber)+1, установив для каждого свой собственный clientId. Я надеялся, что смогу рассчитывать на то, что транзакция завершится неудачно (выбросит ObjectExists), если клиент B уже создал TicketNumber
объектов в этом диапазоне.
Однако, если клиент A или клиент B отключены во время создания, он будет легко создавать локальные копии в том же диапазоне. Когда происходит синхронизация, она устанавливает clientId
конфликтующего объекта в зависимости от того, какой клиент «создал» его последним. Очевидно, что для меня это проблема, если оба клиента уже распечатали билет с одним и тем же серийным номером.
На мой взгляд, чтобы гарантировать право собственности клиента на номера тикетов, мне нужно будет создавать объекты «сначала онлайн», чтобы я мог наблюдать за конфликтами и реагировать на них. Есть ли способ узнать состояние подключения клиента области? Возможно ли то, что я пытаюсь сделать? Должен ли я ждать, пока счетчики будут доступны?