0

我创建了一个 Xamarin.Forms PCL 项目并尝试访问存储在 sqlite 数据库中的本地数据,该数据库在 Android 中是工作文件,但在 iOS 中不工作。每当我尝试使用 DependencyService 调用 iOS 特定代码时,它都会抛出 System.NullReferenceException: Object reference not set to an object of an instance。

这是我的来电声明

var db = DependencyService.Get<IDBPath>().GetDBPath();

这是我用于获取 Sqlite 连接的 iOS 特定代码

using SQLite.Net;
using SQLite.Net.Async;
using SQLite.Net.Platform.XamarinIOS;
using SwachhParyatanApp.iOS;
using System;
using System.IO;

[assembly: Xamarin.Forms.Dependency(typeof(DBPath_iOS))]

namespace SwachhParyatanApp.iOS
{
    class DBPath_iOS
    {
        public SQLiteAsyncConnection GetDBPath()
        {
            var sqliteFilename = "localData.db";
            string folder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            string libraryPath = Path.Combine(folder, "..", "Library");
            var path = Path.Combine(libraryPath, sqliteFilename);
            var platform = new SQLitePlatformIOS();
            var param = new SQLiteConnectionString(path, false);
            var connection = new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(platform, param));
            return connection;
        }
    }
}

我认为调用方法不会到达 iOS 特定代码,因为我在 iOS 特定代码中使用了断点,但它从未到达断点并立即给出错误。我也尝试过查看异常以获取详细信息,但没有内部异常,并且在堆栈跟踪中它只指向调用该方法的行。

4

1 回答 1

1

下面使用 SQLite.Net PCL 是 SQLite 的 iOS 依赖注入接收者的工作示例。我注意到的几个区别是您的数据库扩展名 .db 而不是 .db3 并且您的“程序集”标头没有实现完整的命名空间。我不确定这是否重要。

[assembly: Dependency(typeof(NameSpace.iOS.SQLiteUtility.SQLite_iOS))]

namespace NameSpace.iOS.SQLiteUtility
{
class SQLite_iOS : ISQLite
{

    public SQLiteConnection GetConnection()
    {
        try
        {
            var sqliteFilename = "MyDB.db3";
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
            string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder
            var path = Path.Combine(libraryPath, sqliteFilename);

            var plat = new SQLite.Net.Platform.XamarinIOS.SQLitePlatformIOS();

            var conn = new SQLite.Net.SQLiteConnection(plat, path,
                SQLite.Net.Interop.SQLiteOpenFlags.ReadWrite |
                SQLite.Net.Interop.SQLiteOpenFlags.Create |
                SQLite.Net.Interop.SQLiteOpenFlags.FullMutex, true);



            return conn;
        }
        catch (SQLiteException ex)
        {
            Helpers.Helper_ErrorHandling.SendErrorToServer(ex);
            return null;
        }
        catch (System.Exception ex)
        {
            Helpers.Helper_ErrorHandling.SendErrorToServer(ex);
            return null;
        }

    }
}

如果它必须是异步版本,您可能需要查看How to use SQLiteAsyncConnection from the async PCL version of SQLite?

于 2016-03-30T23:51:14.617 回答