2017-04-26 2 views
0

Ich bin zur Zeit einen iOS-App mit Xamarin Entwicklung und lief in einen seltsamen Fehler mit SQLite-net-pcl:SQLite-net-pcl {SQLite.SQLiteException: near ")": Syntaxfehler

{SQLite.SQLiteException: near ")": syntax error at SQLite.SQLite3.Prepare2 (SQLitePCL.sqlite3 db, System.String query) [0x0001e] in <49ac49cfb94341128f6929b3ff2090ee>:0 at SQLite.PreparedSqlLiteInsertCommand.Prepare() [0x00011] in <49ac49cfb94341128f6929b…} 

die Fehler occours, wenn ich will in eine Tabelle des folgenden Modells einzufügen:

public class PPPCount 
{ 
    public PPPCount() 
    { 
    } 

    [PrimaryKey] 
    public int Id { get; set; } 
    public string PerpePartCount { get; set; } 
} 

Hier ist die Telefonvorwahl:

try 
{ 
    var con = await DbFactory.Instance(); 
    var perpetrationPartCount = await 
     service.GetSumPerpetrationParts(immobilePerpetrationId); 

    var dbModel = await con.FindAsync<PPPCount>(immobilePerpetrationId); 
    if (dbModel == null) 
    { 
     var model = new PPPCount(); 

     model.Id = immobilePerpetrationId; 
     model.PerpePartCount = perpetrationPartCount; 

     //This causes the exception!!!! 
     await con.InsertAsync(perpetrationPartCount); 
    } 
    else 
    { 
     if (dbModel.PerpePartCount != perpetrationPartCount) 
     { 
      dbModel.PerpePartCount = perpetrationPartCount; 
      await con.UpdateAsync(dbModel); 
     } 
    } 
    return perpetrationPartCount; 
} 
catch (Exception e) 
{ 
    //AlertHelper.ShowError(e.Message); 
} 

T er Code des DbFactory, das schafft und hält mein SQLite Verbindungsobjekt:

public class DbFactory 
{ 
    private static SQLiteAsyncConnection connection; 

    public static async Task<SQLiteAsyncConnection> Instance() 
    { 
     if (connection == null) 
     { 
      bool deleteDb = false; 
      string folder = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
      var dbPath = System.IO.Path.Combine(folder, "..", "immotech_offline.db3"); 

      if (File.Exists(dbPath) && deleteDb) 
      { 
       File.Delete(dbPath); 
      } 

      connection = new SQLiteAsyncConnection(dbPath); 

      try 
      { 

       await connection.CreateTableAsync<ImmobilePerpetration>(); 
       await connection.CreateTableAsync<Customer>(); 
       await connection.CreateTableAsync<PPPCount>(); 
      } 
      catch (Exception e) 
      { 
       //TODO: Delete this part! 
       int i = 0; 
      } 
     } 

     return connection; 
    } 
} 

Das Merkwürdige ist, ich mit den beiden anderen Modellen ohne Probleme arbeiten kann! Ich kann wirklich nicht erklären, was diesen Fehler verursacht, und ich habe versucht, die Ablaufverfolgung zu aktivieren, um die SQL-Anweisungen anzuzeigen, aber unglücklicherweise bietet die Async-Version des SQLite-Verbindungsobjekts keine Ablaufverfolgung.

Dann habe ich versucht, den gleichen Code in synchronen Version mit aktivierter Ablaufverfolgung und das ist das Ergebnis:

insert into "Int32"() values() 

Gut, das ist ganz klar, warum es funktioniert Nichtstellung aber wie kann eine solche Aussage erzeugt werden? Habe ich etwas verpasst oder es ist ein Fehler?

UPDATE: Ja, ich habe die Suchfunktion verwendet und kein Fall passt für mein Problem.

+0

Welcher Typ von 'service.GetSumPerpriseParts (immobilePerperationId);'? Denn das ist was du einfügst. – valdetero

Antwort

3

Sollte dies:

await con.InsertAsync(perpetrationPartCount); 

sein:

await con.InsertAsync(model); 

Wir nicht, welche Art perpetrationPartCount basiert auf dem Code berichten. Es ist möglicherweise kein PPPCount und daher ist diese Entität möglicherweise nicht das Problem.

+0

Oh mein Gott, ich kann nicht glauben, dass ich versucht habe, nur einen ganzzahligen Wert in meine Datenbank einzufügen! Vielen Dank! – WhiteIntel