使用 SqliteNet 时出现异常 [英] Getting exception when using SqliteNet

查看:51
本文介绍了使用 SqliteNet 时出现异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试使用 sqliteNET 执行任何操作时,我不断收到错误消息.我得到了例外:

I keep getting an error when attempting to do anything with sqliteNET. I get exception:

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 语句中失败.

It fails at the create table statement.

这是 URMMobileAccount 类:

Here is URMMobileAccount class:

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

我一直在广泛地研究这个问题,似乎无论出于何种原因,当它尝试创建表映射时,它通过反射获取所有属性然后执行:

I've been looking into this extensively and it seems for whatever reason that when it tries to create the table mappings that it gets all the properties via reflection and then does:

foreach(var p in props)
{
   ...

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

props 是属性列表,colsList.忽略 ignore 变量 p.CanWrite 会为该类中的所有属性返回 false 吗?那不能写,因为 CanWrite 是由具有 setter 方法的属性决定的,对吗?

props is the list of properties and cols is a List<Column>. Ignoring the ignore variable p.CanWrite returns false for all the properties in that class? That couldn't be write as CanWrite is determined by the property having a setter method, right?

推荐答案

您使用的是最新的 SQLite-net 吗?分发库的人很多,但只有一个正式版本,来源:

Are you using the most recent SQLite-net? There are lots of people distributing the library, but there is only one official version, the source:

https://github.com/praeclarum/sqlite-net/tree/主/源

(很快就会有一个不错的 PCL 正式版本,但我们仍在解决一些错误.)

(Soon there will be a nice PCL official release, but we're still working through some bugs.)

我刚刚编写了这个测试应用,一切正常:

I just wrote this test app and everything works fine:

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");
        }
    }
}

这篇关于使用 SqliteNet 时出现异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆