Получение исключения при использовании SqliteNet

Я продолжаю получать сообщение об ошибке при попытке сделать что-либо с sqliteNET. Я получаю исключение:

near ")": syntax error
  at SQLite.SQLite3.Prepare2 (IntPtr db, System.String query) [0x00029] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Database/SQLite.cs:3025 
  at SQLite.SQLiteCommand.Prepare () [0x00012] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Database/SQLite.cs:2190 
  at SQLite.SQLiteCommand.ExecuteNonQuery () [0x00026] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Database/SQLite.cs:2055 
  at SQLite.SQLiteConnection.Execute (System.String query, System.Object[] args) [0x00046] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Database/SQLite.cs:642 
  at SQLite.SQLiteConnection.CreateTable (System.Type ty, CreateFlags createFlags) [0x000a9] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Database/SQLite.cs:412 
  at SQLite.SQLiteConnection.CreateTable[URMMobileAccount] (CreateFlags createFlags) [0x00000] in <filename unknown>:0 
  at UltraRoute.URMLogin+<LoginToURM>c__AnonStorey1.<>m__0 () [0x000bc] in /Users/ultradev/Projects/URM Mobile/UltraRoute/ViewControllers/URMLogin.cs:216 
  at MonoTouch.Foundation.NSAsyncActionDispatcher.Apply () [0x00000] in /Developer/MonoTouch/Source/maccore/src/Foundation/.pmcs-compat.NSAction.cs:90 
  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/.pmcs-compat.UIApplication.cs:38 
  at UltraRoute.Application.Main (System.String[] a) [0x0006a] in /Users/ultradev/Projects/URM Mobile/UltraRoute/Main.cs:66 

Мой код выглядит так:

using (var db = new SQLite.SQLiteConnection (Global.DatabasePath)) 
{           
    try 
    {
         db.CreateTable<URMMobileAccount> ();
         var localAccount = db.Query<URMMobileAccount> ("Select * from URMMobileAccount");                                                      

         if (localAccount.Any ()) 
         {                  
             UsernameField.Text = localAccount [0].Username;                
         }      
     }
     catch (Exception ex) 
     {              
        Global.Log (ex.Message, ex.StackTrace, LogLevel.SEVERE);
     }
 }

Он терпит неудачу в операторе создания таблицы.

Вот класс URMMobileAccount:

public class URMMobileAccount
{
  [PrimaryKey, AutoIncrement]
  public int URMID {get;set;}
  public int Id {get; set;}
  public string Username {get; set;}
  public string Password {get; set;}
  public string Type {get; set;}
  public Nullable<int> TypeId {get; set;}
  public bool IsValid {get; set;}
}

Я тщательно изучал это, и по какой-то причине кажется, что когда он пытается создать сопоставления таблиц, он получает все свойства через отражение, а затем делает:

foreach(var p in props)
{
   ...

   if(p.CanWrite && !ignore)
   {
      cols.Add(new Column(p, createFlags));
   }
}

props — это список свойств, а cols — это List<Column>. Игнорирование переменной ignore p.CanWrite возвращает false для всех свойств в этом классе? Это не могло быть записано, так как CanWrite определяется свойством, имеющим метод установки, верно?


person jharr100    schedule 16.06.2014    source источник
comment
Что такое URMMobileAccount?   -  person CL.    schedule 17.06.2014
comment
это класс, который я определил... я обновлю   -  person jharr100    schedule 17.06.2014
comment
FWIW, ваш код работает под .NET (у меня не было ошибок), поэтому он, вероятно, связан с реализацией отражения MonoTouch.   -  person chue x    schedule 17.06.2014


Ответы (1)


Вы используете самую последнюю версию SQLite-net? Библиотеку распространяет много людей, но есть только одна официальная версия, источник:

https://github.com/praeclarum/sqlite-net/tree/master/src

(Скоро будет хороший официальный релиз PCL, но мы все еще работаем над некоторыми ошибками.)

Я только что написал это тестовое приложение, и все работает нормально:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using SQLite;

namespace SO24247435
{
    public class URMMobileAccount
    {
        [PrimaryKey, AutoIncrement]
        public int URMID {get;set;}
        public int Id {get; set;}
        public string Username {get; set;}
        public string Password {get; set;}
        public string Type {get; set;}
        public Nullable<int> TypeId {get; set;}
        public bool IsValid {get; set;}
    }

    [Register ("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate
    {
        UIWindow window;

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            using (var db = new SQLiteConnection (
                Path.Combine(Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments),"test.sqlite"))) 
            {           
                try 
                {
                    db.CreateTable<URMMobileAccount> ();
                    var localAccount = db.Query<URMMobileAccount> ("Select * from URMMobileAccount");                                                      

                    if (localAccount.Any ()) 
                    {   
                        Console.WriteLine (localAccount [0].Username);
                    }      
                }
                catch (Exception ex) 
                {              
                    Console.WriteLine (ex);
                }
            }

            window = new UIWindow (UIScreen.MainScreen.Bounds);
            // window.RootViewController = myViewController;
            window.MakeKeyAndVisible ();

            return true;
        }

        static void Main (string[] args)
        {
            UIApplication.Main (args, null, "AppDelegate");
        }
    }
}
person Frank Krueger    schedule 17.06.2014