1

同期されたデータベース クライアントに (連続した範囲から) 簡潔な整数の主キーを事前に割り当てる必要があります。

使用例は非常に単純です。モバイル クライアントの接続が断続的である状況で、短いシリアル番号が記載されたチケットを印刷する必要があります。番号は、ドアの賞品を授与するために、騒がしい環境で悪いPAシステムで読み取られるのに十分短くなければなりません.

Realm はこのタスクに最適のように思えますが、各クライアントがサーバーに接続されたときに、保証された一意のシリアル番号のプールを事前に割り当てられるようにする必要があります。これにより、後でオフラインの場合でもチケットを印刷できます。

class TicketNumber extends RealmObject { 
    @PrimaryKey int serialNumber;
    String clientId; // instance identifier unique to each client
}

私の意図は、クライアント A がトランザクションを実行してTicketNumbermax(serialNumber)+1 から始まる一連のオブジェクトを作成し、それぞれに独自の clientId を設定することです。TicketNumberクライアント B がその範囲内のオブジェクトを既に作成している場合、トランザクションの失敗 (ObjectExists のスロー) に依存できることを期待していました。

ただし、作成時にクライアント A またはクライアント B のいずれかが切断された場合、同じ範囲にローカル コピーが作成されます。同期が発生するclientIdと、競合するオブジェクトの が、最後に「作成」されたクライアントに設定されます。両方のクライアントが同じシリアル番号のチケットをすでに印刷している場合、これは明らかに私にとって問題です。

私が見ているように、チケット番号のクライアント所有権を保証するには、オブジェクトの作成を「オンライン ファースト」で行う必要があります。これにより、競合を観察して対応することができます。レルム クライアントの接続状態を知る方法はありますか? 私がやろうとしていることは可能ですか?カウンターが利用可能になるまで待つ必要がありますか?

4

1 に答える 1

0

分散デバイス間でローカル ID を生成する最も簡単な方法は、整数と制限された範囲を使用しないことですが、UUID:UUID.randomUUID().toString()は 128 ビット値であるため、十分なはずです。2 つのデバイスで 2 つのキーが同じであるよりも、障害のあるハードウェアが台無しになったり、地球の光線がビットを交換したりする可能性が高くなります。

これは基本的に、他のすべての分散データベースも同様です。

于 2016-12-05T08:44:13.080 に答える