Кроме обычных файлов для хранения данных мы можем использовать локальные базы данных. Наиболее популярной системой баз данных для локальных приложений является SQLite, поэтому рассмотрим общие принципы работы с этой СУБД.
Итак, создадим новый проект по типу Blank. Назовем его SQLiteApp.
Для работы с SQLite можно использовать разные подходы и библиотеки. Рекомендуемой библиотекой является SQLite.NET, которая представляет простое ORM-решение (Object Relational Mapping) для Xamarin. Она позволяет работать с базой данных как с хранилищем объектов и манипулировать данными как объектами стандартных классов C# без использования выражений на языке SQL. И вначале добавим в главный проект в узел References с помощью менеджера NuGet эту библиотеку sqlite-net-pcl:
Следует отметить, что в Nuget можно найти много похожих библиотек с подобным названием. У нужной библиотеки будут следующие данные:
Автор: Frank A. Krueger
Id: sqlite-net-pcl
При работе с SQLite в Xamarin есть один минус - полный путь к базе данных на каждой отдельной платформе будет отличаться. И чтобы решить эту задачу, нам надо использовать внедрение зависимостей. Определим интерфейс, который будет определять метод для получения пути к бд:
namespace SQLiteApp { public interface ISQLite { string GetDatabasePath(string filename); } }
Единственный метод интерфейса в качестве параметра принимает название файла базы данных.
В проект для iOS также через NuGet добавим ту же самую библиотеку sqlite-net-pcl:
После добавления библиотек добавим в проект для iOS следующий класс:
using System; using Xamarin.Forms; using System.IO; using SQLiteApp.iOS; [assembly: Dependency(typeof(SQLite_iOS))] namespace SQLiteApp.iOS { public class SQLite_iOS : ISQLite { public SQLite_iOS() { } public string GetDatabasePath(string sqliteFilename) { // определяем путь к бд string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); string libraryPath = Path.Combine(documentsPath, "..", "Library"); // папка библиотеки var path = Path.Combine(libraryPath, sqliteFilename); return path; } } }
Подобные действия проведем в проекте для Androida. Сначала добавим ту же самую библиотеку через NuGet:
Далее добавим в проект класс, реализующий интерфейс ISQLite:
using System; using SQLiteApp.Droid; using System.IO; using Xamarin.Forms; [assembly: Dependency(typeof(SQLite_Android))] namespace SQLiteApp.Droid { public class SQLite_Android : ISQLite { public SQLite_Android() { } public string GetDatabasePath(string sqliteFilename) { string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var path = Path.Combine(documentsPath, sqliteFilename); return path; } } }
Данный класс аналогично создает подключение к базе данных.
В проект для UWP также установим ту же самую библиотеку. И также добавим такой же класс в проект для UWP:
using System.IO; using Windows.Storage; using Xamarin.Forms; using SQLiteApp.UWP; [assembly: Dependency(typeof(SQLite_UWP))] namespace SQLiteApp.UWP { public class SQLite_UWP : ISQLite { public SQLite_UWP() { } public string GetDatabasePath(string sqliteFilename) { // для доступа к файлам используем API Windows.Storage string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename); return path; } } }