0

Xamarin.Forms PCL プロジェクトを作成し、Android では作業ファイルであるが iOS では作業していない sqlite データベースに格納されているローカル データにアクセスしようとしています。DependencyService を使用して iOS 固有のコードを呼び出そうとすると、System.NullReferenceException: Object reference not set to an object がスローされます。

これが私の呼びかけ文です

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 依存性注入受信者の実例です。私が気づいたいくつかの違いは、.db3 の代わりに .db の db 拡張子と、「アセンブリ」ヘッダーが完全な名前空間を実装していないことです。それが重要かどうかはわかりません。

[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 に答える