Я пытаюсь поэкспериментировать с новой платформой для меня, Xamarin Forms. Основываясь на знаниях .Net Core и EF Core, я решил начать с внедрения службы Sqlite ORM (sqlite-net-pcl) в шаблон Xamarin Forms Shell, включенный в Visual Studio 2019. В этом шаблоне уже реализована служба Mock CRUD, основанная наструктура данных в памяти, поэтому я хотел реализовать свой собственный сервис и внедрить его с помощью DependencyService. Сначала я изменил модель данных с необходимым атрибутом:
public class Item
{
[PrimaryKey, AutoIncrement]
public string Id { get; set; }
public string Text { get; set; }
public string Description { get; set; }
}
Затем я внедрил службу CRUD:
public class SqliteDataStore : IDataStore<Item>
{
private readonly SQLiteConnection _db;
public SqliteDataStore()
{
_db = new SQLiteConnection(Path.Combine(FileSystem.AppDataDirectory, "items.sqlite"));
_db.CreateTable<Item>();
if (_db.Table<Item>().Count().Equals(0))
{
_db.InsertAll(new List<Item>
{
new Item { Id = Guid.NewGuid().ToString(), Text = "First item", Description = "This is the first item description." },
new Item { Id = Guid.NewGuid().ToString(), Text = "Second item", Description = "This is the second item description." },
new Item { Id = Guid.NewGuid().ToString(), Text = "Third item", Description = "This is the third item description." }
}
);
}
}
public async Task<bool> AddItemAsync(Item item)
{
_db.Insert(item);
return await Task.FromResult(true);
}
public async Task<bool> DeleteItem(string id)
{
_db.Delete<Item>(id);
return await Task.FromResult(true);
}
public async Task<Item> GetItemAsync(string id)
{
return await Task.FromResult(_db.Get<Item>(id));
}
public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
{
return await Task.FromResult(_db.Table<Item>().ToList());
}
public async Task<bool> UpdateItemAsync(Item item)
{
_db.Update(item);
return await Task.FromResult(true);
}
}
Затем я изменил внедренную службу в классе приложения:
public App()
{
InitializeComponent();
DependencyService.Register<SqliteDataStore>();
MainPage = new AppShell();
}
Эта реализация правильно работает с EF Core в Xamarin Forms, но EF Core работает очень медленно, поэтому я изменил ORM (sqlite-net-pcl), и он не работает.