2016-04-17 11 views
0

Ich arbeite an einem Code, der Ereignis generieren, in eine DynamoDB-Tabelle, sortiert nach EventID. Um eine eindeutige Ereignis-ID für jedes Ereignis zu generieren, erzeuge ich eine Zufallszahl und frage dann in die Datenbank, falls sie bereits existiert. Wenn es wiederholt, bis es nicht tut.DynamoDB Query Xamarin.Forms

Ich habe ein Problem in meine DB abzufragen, mein Code scheint nicht zu funktionieren. Ich habe Probleme zu verstehen, wie Sie die Anfrage erstellen, zum Beispiel, wofür das Feld "IndexName" verwendet wird, wenn ich in "KeyConditionExpression" bereits sage, wonach gesucht werden soll.

Hier ist mein Code von der doc von aws inspiriert:

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; 
      }); 
     } 
    } 

Wenn Sie irgendwelche Ideen haben, wie man nicht in die DB jedes Mal sehe ich es gerne betrachten werde. Beachten Sie, dass _lstEvent könnte nur ein Int sein, aber aus Gründen brauche ich es ObservableCollection

+0

Statt einer „Zufallszahl“, haben Sie darüber nachgedacht, einen 'GUID' mit (' System.Guid.NewGuid'), wie es wird „einzigartig“ sein und Sie müssen nicht zu Durchsuchen Sie die Datenbank vor dem Einfügen. – SushiHangover

+0

Noch nie davon gehört. Kann ich nach Google sicher sein, dass es nie wieder dasselbe sein wird? Wenn ja, werde ich es definitiv verwenden. Aber haben Sie eine Idee, warum die Abfrage nicht funktioniert? –

+0

Microsoft (und der Rest der Tech-Welt) verwendet seit langer Zeit GUID/UUID/etc. Sie können darauf vertrauen, dass sie einzigartig sind ;-) – SushiHangover

Antwort

1

Statt einer "Zufallszahl", mit einer GUID (System.Guid.NewGuid) als es wird "einzigartig" und Sie werden muss die Datenbank nicht vor dem Einfügen durchsuchen.

Datenbank-Entwickler und Administratoren können GUIDs als Primärschlüssel für Datenbanktabellen, um sicherzustellen, Einzigartigkeit zwischen Datenbank-Servern, auf Kosten der Herstellung die Arbeitssatzgröße für das Caching viel größer für einen relationalen Datenbank-Server verwenden, möglicherweise die Anwendungsleistung zu beeinträchtigen.

https://en.wikipedia.org/wiki/Globally_unique_identifier

So ist der Untergang der GUIDs sind sie „größeren“ in Bezug auf die Speicher Bytes sind und somit Speicher-Caching erhöht, aber sie sind für alle Nutzer einzigartig, Server, etc ... und Sie Sie müssen keine Transaktions-Einfügungen wiederholen, bis Sie eine nicht verwendete "zufällige" Zahl treffen.

Via Microsoft:

Ein GUID ist eine 128-Bit-Ganzzahl (16 Bytes), die auf allen Computern und Netzwerken verwendet werden können, wo auch immer eine eindeutige Kennung erforderlich ist. Ein solcher Identifizierer weist eine sehr geringe Wahrscheinlichkeit auf, dupliziert zu werden.

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