使用SqliteNet时获得异常

时间:2014-06-16 15:41:28

标签: c# sqlite xamarin.ios syntax-error sqlite-net

尝试使用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);
     }
 }

在create table语句中失败。

这是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是属性列表,colsList<Column>。忽略ignore变量p.CanWrite为该类中的所有属性返回false?这不能写,因为CanWrite是由具有setter方法的属性决定的,对吗?

1 个答案:

答案 0 :(得分:0)

您使用的是最新的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");
        }
    }
}