2016-03-30 14 views
0

Ich habe ein Xamarin.Forms PCL-Projekt erstellt und versucht, auf die lokalen Daten zuzugreifen, die in der SQLITE-Datenbank gespeichert sind, die in Android funktioniert, aber nicht in iOS funktioniert. Wenn ich versuche, den iOS-spezifischen Code mit DependencyService aufzurufen, wird System.NullReferenceException ausgelöst: Objektverweis nicht auf eine Instanz eines Objekts gesetzt.Wie bekomme ich Sqlite Connection in Xamarin Forms in iOS?

Hier ist meine Berufung Aussage

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

Hier ist mein iOS-spezifischer Code für

Sqlite Anschluss bekommt
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; 
     } 
    } 
} 

Ich glaube nicht, die anrufende Methode, um den iOS-spezifischen Code erreichen wird, weil Ich habe den Break Point im iOS-spezifischen Code verwendet, aber er kam nie zum Breakpoint und es gibt sofort den Fehler. Ich habe auch versucht, zu der Ausnahme für Details zu gehen, aber es gibt keine innere Ausnahme und in Stacktrace zeigt es nur auf die Zeile, die die Methode aufgerufen hat.

+0

Sie Klasse suchen möchten. – valdetero

Antwort

1

Verwenden von SQLite.Net PCL unten ist ein funktionierendes Beispiel für eine iOS-Abhängigkeit Injektion Empfänger für SQLite. Ein paar Unterschiede, die ich bemerkte, sind Ihre DB-Erweiterung .db anstelle von .db3 und Ihr 'Assembly'-Header implementiert nicht den vollständigen Namespace. Ich bin mir nicht sicher, ob das zählt.

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

    } 
} 

Wenn es muss die Asynchron-Version Sie sich auch nicht implementiert die `IDBPath` Schnittstelle an How to use SQLiteAsyncConnection from the async PCL version of SQLite?