2016-04-17 11 views
0

私は、イベントIDをソートしてDynamoDBテーブルに入れるイベントを生成するコードを作成しています。各イベントに対して一意のイベントIDを生成するには、乱数を生成し、既に存在する場合はDBにクエリします。それが繰り返されない限り、それは繰り返されます。DynamoDBクエリXamarin.Forms

私のDBに問い合わせるのに問題があります。私のコードは動作していないようです。私は、私がすでにKeyConditionExpressionで何を探しているかについて、IndexNameフィールドが何であるかなど、teリクエストを構築する方法を理解するのに問題があります。あなたがDBに私は喜んでそれを考えるだろうたびに見てどのようにない任意のアイデアを持っている場合は

private int getEventID() { 
     bool isValid = false; 
     int ranEventID = 0; 
     while(!isValid) { 
      isValid = true; 
      Random random = new Random(); 
      ranEventID = random.Next (0, 5); 
      QueryEventID (ranEventID); 
      foreach (int i in _lstEventID) { 
       if (ranEventID == i) 
        isValid = false; 
      } 
     } 
     return ranEventID; 
    } 

    private async void QueryEventID(int ranEventID) { 
     _lstEventID = new ObservableCollection<int>(); 
     using(App.client) { 
      var queryResponse = await App.client.QueryAsync(new QueryRequest() { 
       TableName = "Events", 
       IndexName = "EventID", 
       KeyConditionExpression = "EventID = :v_Id", 
       ExpressionAttributeValues = new Dictionary < string, AttributeValue > { 
        { 
         ":v_Id", new AttributeValue { 
          N = ranEventID.ToString() 
         } 
        } 
       } 
      }); 
      queryResponse.Items.FirstOrDefault((i) => { //This is a workaround for foreach loop with Linq. Could not do .ToList().ForEach 
       _lstEventID.Add(Int32.Parse(i["EventID"].N)); 
       return false; 
      }); 
     } 
    } 

はここでAWSのドキュメントに触発された私のコードです。 _lstEventはintである可能性がありますが、理由はObservableCollectionである必要があります。

+0

代わりに「乱数」の、それは「ユニーク」になり、あなたがする必要はありませんよう、あなたが 'GUID'(' System.Guid.NewGuid')を使用して検討しています挿入の前にデータベースを検索します。 – SushiHangover

+0

これまで聞いたことがありません。 Googleの後、それは決して別のものと同じになることはありませんか?もしそうなら、私は間違いなくそれを使用します。しかし、クエリがうまくいかない理由を知っていますか? –

+0

Microsoft(およびその他の技術界の他の国)はGUID/UUID/etcを長時間使用していますが、それらを一意であると信じることができます;-) – SushiHangover

答えて

1

"乱数"の代わりにGUID(System.Guid.NewGuid)を使用すると "一意"になります。挿入前にデータベースを検索する必要はありません。

データベースの開発者と管理者は、潜在的に、アプリケーションのパフォーマンスに影響を与える、リレーショナルデータベースサーバ用にはるかに大きなキャッシュするためのワーキング・セット・サイズを作るのコストで、データベースサーバ間の一意性を保証するために、データベーステーブルの主キーとしてGUIDを使用することができます。 https://en.wikipedia.org/wiki/Globally_unique_identifier

だからGUIDの没落は、彼らは、ストレージのバイトので、メモリキャッシュが増加しているという点で「大きな」ですが、彼らはなど、すべてのユーザー、サーバー全体で一意である...そしてあなた使用されていない「ランダム」番号にヒットするまで、トランザクション挿入をやり直す必要はありません。マイクロソフト経由

A GUIDは、一意の識別子が必要とされる限り、すべてのコンピュータとネットワーク間で使用することができる128ビットの整数(16バイト)です。このような識別子は、複製される可能性が非常に低い。

参考:https://msdn.microsoft.com/en-us/library/system.guid%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396