【问题标题】:Xamarin Forms can't create SQLite databaseXamarin Forms 无法创建 SQLite 数据库
【发布时间】:2018-11-13 00:09:56
【问题描述】:

我正在使用 Xamarin.Forms 构建一个新项目,并且我想使用 SQLite 来存储用户数据。我正在使用 .Net 标准项目。 我在所有 4 个项目(共享代码、droid、ios 和 uwp)中安装了 Frank A. Krueger 的 sqlite-net-pcl NuGet 包。正如文档告诉您的那样,我在所有项目中创建了 IFileHelper 接口和实现该接口的类。 当我第一次启动应用程序时,我想在数据库中插入一些默认值,但我得到了一个异常。我一直在调试,当在 App.xaml.cs 文档上创建数据库时,它只返回 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();
        }

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

这是共享代码的接口

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);
        }
    }
}

谢谢

【问题讨论】:

  • “我只是遇到了一个异常”——这相当于去找机械师说“仪表板上的一个灯亮了,但我不知道是哪个”。那只是没有帮助。您需要告诉我们发生了哪个特定异常,是哪一行导致的,并包含代码的相关部分。
  • 堆栈跟踪/日志也会有所帮助
  • 一个 AggregateException 意味着发生了多个错误 - 您需要检查 Exception 对象以获取特定错误的详细信息

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


【解决方案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();
}

机器人实现;

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&lt;YourTypeHere&gt;();

【讨论】:

  • 仅供参考:您应该使用实际的 Android 数据库位置,通过 Android Content API GetDatabasePath
  • @SushiHangover,感谢您的反馈。我对 Android 并不太熟悉,因此使用 Xamarin 进行繁重的工作。您能否详细说明我使用的路径方法与您建议的方法之间的区别?
猜你喜欢
  • 2021-05-05
  • 2021-06-06
  • 2017-02-28
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多