2016-05-12 5 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; } 
} 

そして、どのように私はDBに停止を追加する必要がありますかわかりません。 、

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

しかし、私はエラー

名前があり、このようなエラーがある理由を、私は理解して現在のコンテキストで

存在しない「停止した」取得:私はこのような何かをしようしかし、私はそれを修正する方法を知らない。このような構造をDBに追加する最も簡単な方法がある可能性があります。

+0

'List stops = new List 'のように、「停止」と呼ばれる停止のリストを定義する必要があります。 –

+0

私はそれをやるべきですか? Busクラスのクラスでは、私は 'Add_Click'イベントの前に同じように –

+0

を持っています。 –

答えて

1

は、私はデータベースを作成する際に新たなんだと私はバスが含まれているSQLiteのDBを作成するべきで、すべてのバスはストップのリストを含み、すべてのストップはタイムテーブルを含む。

には、SQLiteにオブジェクトのリストを格納することはできません。そのようなものはありませんのでdatatype supported in SQLiteです。したがって、作成したBusesテーブルは、ストップリストをSQLiteに格納しません。

私の理解に基づいて、バスは多くのストップを持つことができ、かつ停止も多くのバスのために使用され、バスの間および停止の関係は、多対多のでなければなりません。だから、別の関係表テーブルバステーブル停止に加えて、を作成する必要があります。テーブルの両方のバスとテーブルの停止は、あなたのシナリオでは非常にシンプルであるため、私は(それが簡単になり、また、動作しますが、冗長性を引き起こす可能性)1関係テーブルここを作成します。

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

もう1つ質問があります。作成したDBを他のプロジェクトで使用することは可能ですか? –

+0

はい、できます。作成されたDBファイルは、DBPath(サンプルはC:¥Users¥YourUserName¥AppData¥Local¥Packages¥4acb2c95-231a-4076-8d1c-b692f3b0660b_nj3bh83vzc3v4¥LocalState¥BusAndStops.sqlite)を使用して見つけることができます。両方のプロジェクトがアクセスできる特殊なフォルダにDBファイルを置くと、2つのプロジェクトで同じDBを共有することもできます。 –

0

問題は、高速オブジェクトが初期化ブロック内の.Net

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

で仕事を初期化する方法です - あなたは値があなたの他のメンバーを取得することはできません。

(あなたがメンバー値、stops.Addがvoidの関数で取得できたとしても - 新しいリストを返しません)

クイック初期化方法を使用する場合:

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); 
} 
関連する問題