2016-05-12 4 views
0

Я новичок в создании баз данных, и мне нужно создать SQLite DB, содержащую шины, каждая шина содержит список стопов, и каждый Stop содержит расписание. Я создал класс Автобусы:Как создать базу данных 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' like' List stops = new List '. –

+0

Где я должен это делать? У класса Buses у меня такое же –

+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

Да, мы можем это сделать. Вы можете найти созданный файл DB через 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); 
}