Xamarin Forms无法创建SQLite数据库

时间:2018-06-03 14:16:44

标签: c# sqlite xamarin xamarin.forms sqlite-net-pcl

我正在使用Xamarin.Forms构建一个新项目,我想使用SQLite来存储用户数据。我正在使用.Net标准项目。 我在所有4个项目(共享代码,droid,ios和uwp)中安装了Frank A. Krueger的sqlite-net-pcl NuGet包。我创建了IFileHelper接口和在所有项目中实现该接口的类,就像文档告诉你的那样。 当我第一次启动应用程序时,我想在数据库中插入一些默认值,但我只是得到一个例外。我一直在调试,当在App.xaml.cs doc上创建数据库时,它只返回null,所以我没有得到任何数据库。

我已经反复检查了所有代码,一切都很好,所以我只是想知道sqlite-net-pcl是否与.NET标准项目兼容?这个问题有什么解决方案吗?

这是App.xaml.cs上的代码

static AppDatabase database;

    public App ()
    {
        InitializeComponent();

        MainPage = new MainPage();
    }

    public static AppDatabase Database
    {
        get
        {
            if (database == null)
            {
                database = new AppDatabase(DependencyService.Get<IFileHelper>().GetLocalFilePath("AppDatabase.db3"));
                System.Threading.Thread.Sleep(500);
            }
            return database;
        }
    }

当我返回数据库时,它只返回null,所以当我在AppDatabase类上创建表时,我得到异常System.AggregateException: One or more errors occurred.

readonly SQLiteAsyncConnection Database;

        public AppDatabase(string dbPath)
        {
            Database = new SQLiteAsyncConnection(dbPath);
            Database.CreateTableAsync<Stats>().Wait();
        }

我理解异常,因为数据库是null我不能聚合任何表或任何东西,因为数据库不存在,但为什么它不创建数据库?

这是共享代码的接口

namespace FitApp
{
    public interface IFileHelper
    {
        string GetLocalFilePath(string fileName);
    }
}

在droid项目上实现接口的类:

[assembly: Dependency(typeof(FitApp.Droid.FileHelper))]
namespace FitApp.Droid
{
    public class FileHelper : IFileHelper
    {
        public string GetLocalFilePath(string fileName)
        {
            string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            return System.IO.Path.Combine(path, fileName);
        }
    }
}

由于

1 个答案:

答案 0 :(得分:1)

我发现这个页面确实有助于使用Xamarin开始使用SQLite。 Xamarin - Working with Local Databases in Xamarin.Forms Using SQLite

请注意,此页面未使用async数据库。

我的实施有效。初始化;

public SQLiteAsyncConnection AsyncDb { get; private set; }

    public App ()
    {
        InitializeComponent();
        AsyncDb = DependencyService.Get<IDatabaseConnection>().AsyncDbConnection();
}

接口;

public interface IDatabaseConnection
{
    SQLite.SQLiteAsyncConnection AsyncDbConnection();
}

Droid实施;

public class DatabaseConnection_Droid : IDatabaseConnection
{
    public SQLiteAsyncConnection AsyncDbConnection()
    {
        var dbName = "DiceyData.db3";
        var path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), dbName);
        return new SQLiteAsyncConnection(path);
    }

}

然后您可以在appwide属性上操作,例如; await ((App)Application.Current).AsyncDb.CreateTableAysnc<YourTypeHere>();