2017-04-07 98 views
1

我正在Windows應用商店應用上製作航班數據應用。該應用程序將只追蹤從&到達巴基斯坦的航班。如何解決此sqlite異常約束

我通過JSON從

https://developer.flightstats.com/

得到我的數據,並將其保存到SQLite數據庫。

這是我的職責是獲取數據

P.S:在連接字符串中使用的所有變量聲明和分配,但因爲它們是不相關的,我不向他們展示。

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 + "')"); 
      } 
     } 
    } 
} 

我請求查詢僅支持每小時1個查詢, 所以我做了一個循環,將運行23次。

每小時的飛行次數不同,所以我在第二次循環中使用了data1.flightStatuses.Length。

之後,我將數據插入表中。

當我運行應用程序,我得到下面的異常

enter image description here

我做了調試,而不是插入數據分貝,我在列表框中顯示出來,並且發現這是結果

enter image description here

如果你看結果,時間不是遞增順序。因此,我得到了例外!

那麼,如何組織數據,使時間遞增順序,還是有另一種方式?

+0

我懷疑你嘗試插入行的順序是否導致了約束異常 - 這可能是別的。你可以發佈arrival_data表模式的SQL定義嗎?另外,我強烈強烈建議您使用SqlParameters,而不是直接將數據串聯到SQL字符串中 - 這是SQL注入攻擊的一個巨大安全漏洞。 –

回答

0

幾種原因是可能的,但插入數據的順序不是其中之一。

讓我們仔細看看您的示例數據,尤其是第一行&,它們是重複的!這讓我覺得一個獨特的約束被違反了。

首先要看的是桌子上的主鍵。是flightID

你需要想一想你想用同一航班的多行做什麼。您可能想要查看一種有效更新數據的方式,即在數據已存在或插入(如果不存在)(也稱爲UPSERT),請參閱Q & A here