Использовать локальную базу данных в Xamarin

Я начал использовать плагин Xamarin для Visual Studio для создания приложения для Android.

У меня есть локальная база данных SQL, и я хочу вызвать ее для отображения данных. Я не понимаю, как я могу это сделать. Является ли это возможным?


person user2631662    schedule 10.09.2013    source источник
comment
По теме: forum.xamarin.com/discussion/comment/102126/#Comment_102126   -  person BlueRaja - Danny Pflughoeft    schedule 22.06.2015


Ответы (2)


Подумав, что это тривиальная задача, я оказался неправ, когда попытался создать проект быстрого тестирования. Этот пост будет содержать полное руководство по настройке БД для Android-приложения в Xamarin, которое пригодится в качестве справочника для будущих пользователей Xamarin.

С одного взгляда:

  1. Добавьте Sqlite.cs в свой проект.
  2. Добавьте файл базы данных в качестве актива.
  3. Настройте файл базы данных для сборки как AndroidAsset.
  4. Вручную скопируйте файл базы данных из apk в другой каталог.
  5. Откройте соединение с базой данных с помощью Sqlite.SqliteConnection.
  6. Работайте с базой данных с помощью Sqlite.

Настройка локальной базы данных для проекта Xamarin Android

1. Добавьте Sqlite.cs в свой проект.

Для начала перейдите в этот репозиторий и загрузите Sqlite.cs; это предоставляет Sqlite API, который вы можете использовать для выполнения запросов к вашей базе данных. Добавьте файл в свой проект в качестве исходного файла.

2. Добавить БД как актив.

Затем получите свою БД и скопируйте ее в каталог Assets вашего проекта Android, а затем импортируйте ее в свой проект, чтобы она отображалась под папкой Assets в вашем решении:

введите описание изображения здесь

В этом примере я использую образец базы данных Chinook_Sqlite.sqlite, переименованный в db.sqlite с этого сайта.

3. Настройте БД для сборки как AndroidAsset.

Щелкните правой кнопкой мыши файл БД и установите для него действие сборки AndroidAsset. Это гарантирует, что он будет включен в каталог ресурсов APK.

введите описание изображения здесь

4. Вручную скопируйте БД из APK.

Поскольку БД включена в качестве актива (упакована в APK), вам необходимо ее извлечь.

Вы можете сделать это с помощью следующего кода:

string dbName = "db.sqlite";
string dbPath = Path.Combine (Android.OS.Environment.ExternalStorageDirectory.ToString (), dbName);
// Check if your DB has already been extracted.
if (!File.Exists(dbPath))
{
    using (BinaryReader br = new BinaryReader(Android.App.Application.Context.Assets.Open(dbName)))
    {
        using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
        {
            byte[] buffer = new byte[2048];
            int len = 0;
            while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
            {
                bw.Write (buffer, 0, len);
            }
        }
    }
}

Это извлекает БД как двоичный файл из APK и помещает его во внешний системный путь хранения. На самом деле БД может идти куда угодно, я просто решил прикрепить ее сюда.

Я также читал, что в Android есть папка с базами данных, в которой базы данных хранятся напрямую; Я не мог заставить его работать, поэтому я просто использовал этот метод использования существующей БД.

5. Откройте соединение с БД.

Теперь откройте соединение с БД через класс Sqlite.SqliteConnection:

using (var conn = new SQLite.SQLiteConnection(dbPath))
{
        // Do stuff here...
}

6. Работать с БД.

Наконец, поскольку Sqlite.net - это ORM, вы можете работать с базой данных, используя свои собственные типы данных:

public class Album
{
    [PrimaryKey, AutoIncrement]
    public int AlbumId { get; set; }
    public string Title { get; set; }
    public int ArtistId { get; set; }
}

// Other code...

using (var conn = new SQLite.SQLiteConnection(dbPath))
{
    var cmd = new SQLite.SQLiteCommand (conn);
    cmd.CommandText = "select * from Album";
    var r = cmd.ExecuteQuery<Album> ();

    Console.Write (r);
}

Резюме

Вот как добавить существующую базу данных Sqlite в ваше решение Xamarin для Android! Для получения дополнительной информации ознакомьтесь с примерами, включенными в библиотеку Sqlite.net, его модульные тесты и examples в документации Xamarin.

person matthewrdev    schedule 10.09.2013
comment
Спасибо, Мэтт, отличный подробный ответ. Но не могли бы вы объяснить, как я могу скопировать локальную базу данных в папку с ресурсами. - person user2631662; 10.09.2013
comment
Конечно может! Папка ресурсов автоматически создается Xamarin при создании проекта Android. Вы должны найти его в каталоге своего проекта. Е.Г .: path\to\project\Assets. Я только что пришел на работу, поэтому пока не могу обновить ответ, сделаю это сегодня вечером. - person matthewrdev; 11.09.2013
comment
Если ответ был полезен / решил вашу проблему, всегда приятно получить его. : D - person matthewrdev; 11.09.2013
comment
У меня такая же проблема с довольно большой базой данных (~ 20 МБ). Не приведет ли это решение к дублированию базы данных один раз в apk и один раз в файловой системе? Это огромная трата пользовательского пространства ... [Edit] Я задал отдельный вопрос здесь. - person BlueRaja - Danny Pflughoeft; 22.06.2015
comment
Да, он это продублирует. Этот ответ предназначен для повторного использования существующей базы данных, которую необходимо связать с вашим приложением. - person matthewrdev; 23.06.2015
comment
@matthewrdev Я новичок в мобильной разработке. Подскажите, пожалуйста, куда писать вышеупомянутый код ?? - person ; 09.11.2016
comment
@matthewrdev, в какую БД копировать .mdf или .log файл? а как создать .sqlite файл? - person ; 09.11.2016
comment
В разделе «Копировать БД из APK вручную» я получаю сообщение «Активы не могут быть разрешены». VS + ReSharper не предлагает, какой пакет импортировать, чтобы решить эту проблему. - person Randell; 09.11.2017
comment
@Randell Я обновил этот фрагмент кода, чтобы использовать полностью определенный класс ресурсов, найденный в контексте приложения. - person matthewrdev; 09.11.2017
comment
Примерно 4. Вы будете копировать это каждый раз при запуске вашего приложения? Как скопировать только при первой загрузке / установке? - person Magnus TechApple; 22.07.2018
comment
@matthewrdev Отличный ответ. Я никогда не видел такого подробного ответа. У меня вопрос по шагу 4. Строка Android.App.Application.Context.Assets.Open не разрешена. Какую ссылку я должен добавить? - person Rauf; 03.02.2021

Вот тот, который я использую, и он работает

  • установить плагин Sqlite
  • создать интерфейс для доступа к сервисам разных платформ
  • создать модель для стола
  • реализовать интерфейс, который вы создали ранее, на всей платформе, которую хотите использовать.
  • используйте плагин для создания, получения, вставки и т. д. на вашем столе

для получения более подробной информации проверьте это

person heathkev    schedule 12.02.2019