2016-05-12 47 views
0

我是新創建數據庫,我應該創建一個SQLite DB,其中包含總線,每個總線包含一個停止列表,每個停止包含一個時間表。我創建了一個班級總線:如何創建一個SQLite數據庫UWP

class Buses 
{ 
    [PrimaryKey, AutoIncrement] 
    public string number { get; set; } 
    public List<Stop> stops = new List<Stop>(); 
} 

public class Stop 
{ 
    public string StopName { get; set; } 
    public string Timetable { get; set; } 
} 

而且我不知道應該如何將停止點添加到數據庫。我想是這樣的:

private void Add_Click(object sender, RoutedEventArgs e) 
    { 
     var s = conn.Insert(new Buses() 
     { 
      number = Id.Text, 
      stops = stops.Add(new Stop { StopName = StopName.Text, Timetable = Time.Text }); 
} 

,但我得到的錯誤

名稱「停止」在目前情況下

我明白了,爲什麼會出現這樣的錯誤是不存在的,但我不知道,如何解決它。有可能,有最簡單的方法來將這些結構添加到數據庫中。

+0

您需要定義一個叫做'stop'的Stop列表,就像'List stops = new List '。 –

+0

我應該怎麼做?在班級巴士我有相同的 –

+0

例如在'Add_Click'事件之前。 –

回答

1

我在創建數據庫是新的,我應該創建一個SQLite數據庫,其中包含公交車,每輛巴士包含停止列表,每個停止包含一個時間表。

不能創建一個列的表來存儲對象的SQLite中的列表。因爲沒有這樣的datatype supported in SQLite。所以你創建的Buses表將永遠不會將其停止列表存儲到SQLite中。

根據我的理解,總線可以有許多停止,停止也用於很多公交車,公交車之間的關係,並停止應許多一對多。因此,除了表之外,您可能還需要創建另一個關係表錶停止。由於兩個表公共汽車和錶停止在您的方案很簡單,我只創建一個關係表這裏(這使得它更簡單,也適用,但可能會導致冗餘):

class Buses 
{ 
    public string number { get; set; } 

    public string StopName { get; set; } 

    public string Timetable { get; set; } 
} 

使用下面的代碼添加停止

private async void btnAddStop_Click(object sender, RoutedEventArgs e) 
    { 
     // check if the stop is already added for the bus 
     List<Buses> buses = new List<Buses>(); 
     buses = LocalDatabase.GetStopListByBusNumberAndStopName(Id.Text, StopName.Text); 
     if (buses.ToArray().Length > 0) 
     { 
      await new MessageDialog("Cannot add this stop because the stop is already added for the bus!").ShowAsync(); 
     } 
     else 
     { 
      Buses b = new Buses(); 
      b.number = Id.Text; 
      b.StopName = StopName.Text; 
      b.Timetable = Timetable.Text; 
      // add the stop to db 
      LocalDatabase.InsertStopToDatabase(b); 
      await new MessageDialog("The stop is added successfully!").ShowAsync(); 
     } 
    } 

    // get the buses by bus number 
    public static List<Buses> GetStopListByBusNumber(string busNumber) 
    { 
     List<Buses> results = new List<Buses>(); 
     using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath)) 
     { 
      results = conn.Query<Buses>("SELECT * FROM Buses WHERE number = ?", busNumber); 
     } 
     return results; 
    } 

    // get the buses by bus number and stop name 
    public static List<Buses> GetStopListByBusNumberAndStopName(string busNumber, string stopName) 
    { 
     List<Buses> results = new List<Buses>(); 
     using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath)) 
     { 
      results = conn.Query<Buses>("SELECT * FROM Buses WHERE number = ? AND StopName = ?", busNumber, stopName); 
     } 
     return results; 
    } 

然後使用下面的代碼檢索停止列表公共汽車

// get the buses by bus number 
    public static List<Buses> GetStopListByBusNumber(string busNumber) 
    { 
     List<Buses> results = new List<Buses>(); 
     using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath)) 
     { 
      results = conn.Query<Buses>("SELECT * FROM Buses WHERE number = ?", busNumber); 
     } 
     return results; 
    } 

以下是entire sample供您參考。

+0

非常感謝! –

+0

我還有一個問題:是否可以創建數據庫,以便在其他項目中使用它? –

+0

是的,我們可以做到這一點。您可以通過DBPath找到創建的數據庫文件(例如:C:\ Users \ YourUserName \ AppData \ Local \ Packages \ 4acb2c95-231a-4076-8d1c-b692f3b0660b_nj3bh83vzc3v4 \ LocalState \ BusAndStops.sqlite)。如果您將數據庫文件放入兩個項目均可訪問的特殊文件夾中,那麼這兩個項目甚至可以共享相同的數據庫。 –

0

的問題是這樣的快對象在.net

var s = conn.Insert(new Buses() 
    { 
     number = Id.Text, 
     stops = stops.Add(new Stop { StopName = StopName.Text, Timetable = Time.Text }); 
    } 

裏面的初始化程序初始化工作 - 你不能讓你的價值觀其他成員。

(即使你能拿成員值,函數stops.Add是無效的 - 這不返回一個新的列表)如果要使用快速初始化方式

var s = conn.Insert(new Buses() 
{ 
    number = Id.Text, 
    stops = new List<Stop>() 
    { 
     new Stop { StopName = StopName.Text, Timetable = Time.Text }), 
    } 
} 

或者你可以不用:

private void Add_Click(object sender, RoutedEventArgs e) 
{ 
    var bus = new Buses() 
    { 
     number = Id.Text, 
    }; 
    bas.stops.Add(new Stop { StopName = StopName.Text, Timetable = Time.Text }); 
    var s = conn.Insert(bus); 
}