Как получить соединение Sqlite в Xamarin Forms в iOS?

Я создал проект Xamarin.Forms PCL и пытаюсь получить доступ к локальным данным, хранящимся в базе данных sqlite, которая является рабочим файлом в Android, но не работает в iOS. Всякий раз, когда я пытаюсь вызвать специальный код iOS с помощью DependencyService, он выдает System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта.

Вот мое заявление о вызове

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

Вот мой специальный код для iOS для получения Sqlite Connection

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, но он так и не дошел до точки останова и сразу же выдает ошибку. Я также пытался перейти к исключению для получения подробной информации, но внутреннего исключения нет, и в трассировке стека оно указывает только на строку, которая вызвала метод.


person vishgarg    schedule 30.03.2016    source источник
comment
Ваш класс также не реализует интерфейс IDBPath.   -  person valdetero    schedule 04.04.2016


Ответы (1)


Использование SQLite.Net PCL ниже является рабочим примером получателя инъекции зависимостей iOS для SQLite. Я заметил пару отличий: ваше расширение базы данных .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;
        }

    }
}

Если это должна быть асинхронная версия, вы можете посмотреть Как использовать SQLiteAsyncConnection из асинхронной PCL-версии SQLite?

person ClintL    schedule 30.03.2016