同期されたデータベース クライアントに (連続した範囲から) 簡潔な整数の主キーを事前に割り当てる必要があります。
使用例は非常に単純です。モバイル クライアントの接続が断続的である状況で、短いシリアル番号が記載されたチケットを印刷する必要があります。番号は、ドアの賞品を授与するために、騒がしい環境で悪いPAシステムで読み取られるのに十分短くなければなりません.
Realm はこのタスクに最適のように思えますが、各クライアントがサーバーに接続されたときに、保証された一意のシリアル番号のプールを事前に割り当てられるようにする必要があります。これにより、後でオフラインの場合でもチケットを印刷できます。
class TicketNumber extends RealmObject {
@PrimaryKey int serialNumber;
String clientId; // instance identifier unique to each client
}
私の意図は、クライアント A がトランザクションを実行してTicketNumber
max(serialNumber)+1 から始まる一連のオブジェクトを作成し、それぞれに独自の clientId を設定することです。TicketNumber
クライアント B がその範囲内のオブジェクトを既に作成している場合、トランザクションの失敗 (ObjectExists のスロー) に依存できることを期待していました。
ただし、作成時にクライアント A またはクライアント B のいずれかが切断された場合、同じ範囲にローカル コピーが作成されます。同期が発生するclientId
と、競合するオブジェクトの が、最後に「作成」されたクライアントに設定されます。両方のクライアントが同じシリアル番号のチケットをすでに印刷している場合、これは明らかに私にとって問題です。
私が見ているように、チケット番号のクライアント所有権を保証するには、オブジェクトの作成を「オンライン ファースト」で行う必要があります。これにより、競合を観察して対応することができます。レルム クライアントの接続状態を知る方法はありますか? 私がやろうとしていることは可能ですか?カウンターが利用可能になるまで待つ必要がありますか?