0

我尝试为我尝试新平台 Xamarin Forms。基于 .Net Core 和 EF Core 知识,我决定首先在 Visual Studio 2019 中包含的 Xamarin Forms Shell 模板中注入 Sqlite ORM 服务 (sqlite-net-pcl)。在此模板中,已经实现了基于 in- 的 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);
    }
}

接下来我在 App 类中更改了注入服务:

public App()
{
    InitializeComponent();

    DependencyService.Register<SqliteDataStore>();
    MainPage = new AppShell();
}

此实现与 Xamarin Forms 中的 EF Core 一起正常工作,但 EF Core 非常慢,所以我更改了 ORM (sqlite-net-pcl),但它不起作用。

4

1 回答 1

1

依赖 servicee的文档中,它说:

重要的

Register在从共享代码调用平台实现提供的功能之前,必须在平台项目中注册方法。

所以,我认为你DependencyService.Register<SqliteDataStore>();在错误的地方添加了这条线。

解决方案

例如,在 iOS 中应该是:

[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());

        DependencyService.Register<SqliteDataStore>();

        return base.FinishedLaunching(app, options);
    }
}

在安卓中:

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);

    DependencyService.Register<SqliteDataStore>();


    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
}

还有一些关于在本地 SQLite.NET 数据库中存储数据在 Android 中使用 SQLite.NET 的文档,您可以参考。

于 2019-10-30T06:01:33.897 回答