Как получить данные из базы данных? SQLite на WinRT

В папке проекта я получил готовую базу данных .db с полями "город", "область" и добавленными данными.
Так как же получить информацию из базы данных, где город == какое-то значение?
Я использую C#, sqlite-net и SQLite.


person Aziz Yokubjonov    schedule 04.07.2015    source источник
comment
что именно вы ищете для подключения к sqlite или просто код sql для получения необходимых данных? И что вы пробовали до сих пор?   -  person Techie    schedule 04.07.2015
comment
@Nimesh Я ничего не пробовал, потому что во всех статьях показано, как создать НОВУЮ базу данных, но мне нужно получить данные из существующего файла .db. Я ищу код sqlite (соединение и т. д.), а не запрос (я знаю запрос).   -  person Aziz Yokubjonov    schedule 04.07.2015
comment
@ Нимеш Да. Я уже видел подобный код. И у меня появились вопросы. Как получить данные из существующей базы данных и таблицы? Они показывают, как создать таблицу и получить данные из нее.   -  person Aziz Yokubjonov    schedule 04.07.2015
comment
Из этой статьи второй блок кода предназначен для подключения к существующей базе данных, а последний блок кода — для выборки данных с помощью оператора select. Объединив эти два параметра, вы сможете подключиться к своей базе данных и получить необходимые данные.   -  person Techie    schedule 04.07.2015
comment
@Nimesh, если вы говорите о коде в вопросе, то последний код не работает, потому что класса SQLiteDataReader не существует   -  person Aziz Yokubjonov    schedule 04.07.2015


Ответы (1)


Допустим, у вас есть следующая база данных с одной таблицей, которая выглядит следующим образом:

Схема базы данных

  • добавьте файл базы данных ".db" в свой проект, я решил поместить его в папку данных, чтобы сохранить структуру проекта,
  • установите действие сборки файла базы данных на содержимое, чтобы оно было скопировано в файл AppX при компиляции,

Build action— теперь файл ".db" необходимо скопировать в Локальная (или Перемещаемая) папка в зависимости от ваших потребностей и размера базы данных, добавьте следующий метод в App.xaml.cs файл

    private async Task CopyDatabase()
        {
            bool isDatabaseExisting = false;
            try
            {
                var s = ApplicationData.Current.LocalFolder.Path;
                StorageFile storageFile 
                    = await     ApplicationData.Current.LocalFolder.GetFileAsync("DataBase.db");
                isDatabaseExisting = true;                
            }
            catch
            {
                isDatabaseExisting = false;
            }
            if (!isDatabaseExisting)
            {
                StorageFile databaseFile = await 
                    Package.Current.InstalledLocation.GetFileAsync(@"Data\DataBase.db");
                await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);                
            }
        }

приведенный выше код скопирует базу данных в Локальную папку из InstalledLocation (Appx),

  • вызовите эти методы в методе OnLaunched: введите здесь описание изображения

  • Для того, чтобы вы могли выполнять запросы Sql к базе данных, есть несколько способов, одним из которых является использование SQLitePCL, поэтому добавьте ее в свой проект с помощью Nuget:

Пакет установки SQLitePCL

  • добавьте также ссылку на SQLite для среды выполнения Windows (Windows 8.1), используя этот расширение

  • добавьте модель данных: для каждой таблицы в базе данных создайте класс, который будет содержать ту же структуру, здесь у нас есть только одна таблица 'Data':

     public class Data
      {
        public long Id { get; set; }
        public String City { get; set; }
        public String Area { get; set; }
      }
    
  • добавьте класс, который будет содержать всю логику взаимодействия с данными, и добавьте все необходимые операции с базой данных, используя Sqlite.netPcl lib:

     public class DataService
     {
    private readonly SQLiteConnection _connection;
    public DataService()
    {
        _connection = new SQLiteConnection("DataBase.db");
    }
    
    public async Task<List<Data>> GetAllCities()
    {
        var cities = new List<Data>();
        using (var statement = _connection.Prepare("SELECT * FROM Data"))
        {
            while (statement.Step() == SQLiteResult.ROW)
            {
                cities.Add(new Data()
                {
                    Id = (long)statement[0],
                    City = (string)statement[1],
                    Area = (string)statement[2]                      
                });
            }
        }
        return cities;
    }
    

    }

здесь нет необходимости, чтобы метод был async, но вы можете подумать, что в сложных сценариях

  • наконец, чтобы получить данные, просто вызовите метод GetAllCities:

      public async void MainPage_OnLoaded(object sender, RoutedEventArgs routedEventArgs)
     {
        var dataService=new DataService();
        ListV.ItemsSource = await dataService.GetAllCities();
    
    }
    

Ксамл:

    <ListView x:Name="ListV" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding City}"/>
                <TextBlock Text="{Binding Area}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
person SamTh3D3v    schedule 04.07.2015
comment
О чувак! Большое спасибо! Вы объяснили, зачем нам нужен класс для таблицы. Спасибо еще раз! - person Aziz Yokubjonov; 04.07.2015