2017-04-07 3 views
1

Ich mache eine Flugdaten-App in Windows Store-Apps. Die App erfasst nur Flüge, die von & in Pakistan ankommen.wie diese sqlite Ausnahmeeinschränkung zu beheben

ich meine Daten über JSON von

https://developer.flightstats.com/

und speichern es auf SQLite-Datenbank zu bekommen.

Dies ist meine Funktion, die die Daten

P. S bekommt: alle Variablen in der Verbindungszeichenfolge verwendet werden, erklärt und zugeordnet sind, sondern wie sie sind irrelevant zeige ich sie nicht.

public async void getdata() 
{ 
    var dbpath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "flight_record.sqlite"); 

    for (int hour = 0; hour < 24; hour++) 
    { 
     HttpClient web = new HttpClient(); 
     var response = await web.GetStringAsync("https://api.flightstats.com/flex/flightstatus/rest/v2/json/airport/status/KHI/arr/" + year + "/" + Month + "/" + today + "/" + hour + "?appId=" + appId + "&appKey=" + appKey + "&utc=false&numHours=1&maxFlights=10"); 

     jsondata1 data1 = JsonConvert.DeserializeObject<jsondata1>(response); 

     for (int i = 0; i < data1.flightStatuses.Length; i++) 
     { 
      int f_ID = Convert.ToInt32(data1.flightStatuses[i].flightId); 
      string l_time = data1.flightStatuses[i].arrivalDate.dateLocal.TimeOfDay.ToString(); 
      string year1 = data1.flightStatuses[i].arrivalDate.dateLocal.Year.ToString(); 
      string month1 = data1.flightStatuses[i].arrivalDate.dateLocal.Month.ToString(); 
      string day1 = data1.flightStatuses[i].arrivalDate.dateLocal.Day.ToString(); 
      string departureAirport1 = data1.flightStatuses[i].departureAirportFsCode.ToString(); 
      string arrivalAirport1 = data1.flightStatuses[i].arrivalAirportFsCode.ToString(); 
      string stats = data1.flightStatuses[i].status.ToString(); 
      string FsCode = data1.flightStatuses[i].carrierFsCode.ToString(); 
      string flightNumber1 = data1.flightStatuses[i].flightNumber.ToString(); 

      //here arival_data is my sqlite database table 

      using (var db = new SQLite.SQLiteConnection(dbpath)) 
      { 
       db.Execute("Insert into arrival_data (flightID, time, year, month, day, departureAirport, arrivalAirport, status, airline, carrierFsCode, flightNumber) values ('" + f_ID + "', '" + l_time + "', '" + year1 + "', '" + month1 + "', '" + day1 + 
        "', '" + departureAirport1 + "', '" + arrivalAirport1 + "', '" + stats + "', '" + airline1 + 
        "', '" + FsCode + "', '" + flightNumber1 + "')"); 
      } 
     } 
    } 
} 

Meine Anfrage Abfrage unterstützt nur 1 Abfrage pro Stunde, so gemacht habe ich eine Schleife, die 23-mal ausgeführt wird.

jede Stunde die Anzahl der Flüge sind unterschiedlich, so habe ich data1.flightStatuses.Length in der zweiten Schleife verwendet.

Danach füge ich die Daten in die Tabelle ein.

Wenn ich laufen die App erhalte ich die folgende Ausnahme

enter image description here

ich Debuggen tat und stattdessen Daten des Einsetzens db, ich bin die Anzeige in der List und stellte fest, dass dies das Ergebnis ist

enter image description here

Wenn man sich das Ergebnis sehen, ist die Zeit nicht in der Inkrementierung um. Daher bekomme ich die Ausnahme!

Also, wie organisiere ich die Daten, so dass die Zeit in aufsteigender Reihenfolge ist, oder gibt es einen anderen Weg?

+0

Ich bezweifle, dass die Reihenfolge, in der Sie versuchen, die Zeilen einzufügen, die Einschränkung Ausnahme verursacht - es ist wahrscheinlich etwas anderes. Können Sie die SQL-Definition für das Tabellenschema arrival_data posten? Außerdem empfehle ich dringend, dass Sie SqlParameters verwenden, anstatt Ihre Daten direkt in die SQL-Zeichenfolge zu verketten - dies ist eine große Sicherheitslücke gegenüber SQL-Injection-Angriffen. –

Antwort

0

Mehrere Ursachen sind möglich, aber die Reihenfolge, in der Sie die Daten einfügen, gehört nicht dazu.

Werfen wir einen genaueren Blick auf Ihre Beispieldaten, insbesondere die erste Zeile, sie sind Dubletten! Dies lässt mich glauben, dass eine einzigartige Einschränkung verletzt wird.

Das erste, was Sie sich ansehen sollten, wäre der Primärschlüssel auf Ihrem Tisch. Ist es flightID?

Sie müssen darüber nachdenken, was Sie mit mehreren Zeilen für den gleichen Flug tun möchten. Vielleicht möchten Sie nach einer Möglichkeit suchen, die Daten effizient zu aktualisieren, wenn sie bereits vorhanden sind, oder einzufügen, falls dies nicht der Fall ist, auch bekannt als UPSERT, siehe Q & A here.

Verwandte Themen