尝试使用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
是属性列表,cols
是List<Column>
。忽略ignore
变量p.CanWrite为该类中的所有属性返回false?这不能写,因为CanWrite是由具有setter方法的属性决定的,对吗?
答案 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");
}
}
}