使用 SqliteNet 时出现异常 [英] Getting exception when using 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
是属性列表,cols
是 List
.忽略 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屋!