无法在 UWP 中设置 SQLite 对象 - Xamarin Forms

SQLite object can't be set in UWP - Xamarin Forms

请考虑以下问题:

我正在尝试在 iOS、Android 和 Windows 10 台设备上的 Xamarin Forms 应用程序中使用 SQLite 数据库。

我的数据库模型处于可移植级别,并根据文档使用接口来实现平台特定的 SQLite 连接,我的 iOS 和 Android 实现工作正常,但我似乎无法让我的 UWP 版本工作。似乎每当我尝试对我的 SQLiteConnection database 对象做任何事情时,我都会得到异常 Object reference not set to an instance of an object

请查看我的 PCL 和下面的设备特定代码:

Database.cs(共享)

public class Database
{
    static object locker = new object();
    public static SQLiteConnection database;

    public Database()
    {
        Debug.WriteLine("Attempting to build connection");
        try
        {
            if(database == null)
            {
                Debug.WriteLine("DATABASE IS NULL");
            }

            database = DependencyService.Get<ISQLite>().GetConnection(); // <- Crashes here with: Object reference not set to an instance of an object
            Debug.WriteLine("Get Type: " + database.GetType().ToString());
            Debug.WriteLine("DB Path: " + database.DatabasePath);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }

        database.CreateTable<User>();
    }
}

ISQLite_Windows.cs(设备特定)

class ISQLite_Windows : ISQLite
{
    public ISQLite_Windows()
    {
    }

    public SQLiteConnection GetConnection()
    {
        Debug.WriteLine("This debug never seems to fire");
        var sqliteFilename = "EventManagementSystem.db3";
        string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename);
        var conn = new SQLiteConnection(path);
        Debug.WriteLine("Connection made, returning");
        return conn;
    }
}

有用信息

我正在使用 sqlite-net-pcl 版本 1.5.166-beta 的 beta NuGet 包,因为这似乎是 UWP 的建议选择。

我正在为 NuGet 包使用版本 5.2.2 Microsoft.NETCore.UniversalWindowsPlatform

应用程序构建和智能感知没有发现任何错误,但在 App.cs 初始化期间它中断了。

我似乎无法找到正在我的机器上创建的数据库文件,尽管我怀疑这是因为它在到达之前就中断了。这个问题似乎更多地与在共享级别访问数据库对象有关,而不是与设备特定的实现有关,尽管我对此很可能是错误的。

docs状态:

Registration – Each implementing class must be registered with DependencyService via a metadata attribute. Registration enables DependencyService to find the implementing class and supply it in place of the interface at run time.

您的问题最可能的原因是 ISQLite 没有已注册的实施 class。