2013-07-03 23 views
2

我在Windows应用商店application.I处理SQLite的使用在更新查询过程中抛出NotSupportedException?

var tagPage = db.QueryAsync<MyModel>("UPDATE MyModel SET Tag =2 WHERE id = 1"); 
db.UpdateAsync(tagPage); 

它轻视SQLite.cs类的NotSupportedException异常在方法

public int Update(object obj, Type objType) 
{ 
    if (obj == null || objType == null) 
     { 
      return 0; 
     } 

     var map = GetMapping(objType); 

     var pk = map.PK; 

     if (pk == null) 
     { 
      throw new NotSupportedException("Cannot update " + map.TableName + ": it has no PK"); 
     } 

     var cols = from p in map.Columns 
        where p != pk 
        select p; 
     var vals = from c in cols 
        select c.GetValue(obj); 
     var ps = new List<object>(vals); 
     ps.Add(pk.GetValue(obj)); 
     var q = string.Format("update \"{0}\" set {1} where {2} = ? ", map.TableName, string.Join(",", (from c in cols 
                             select "\"" + c.Name + "\" = ? ").ToArray()), pk.Name); 
     return Execute(q, ps.ToArray()); 
} 

正在更新在表中的值,因为我觉得它不会得到主键,我在表中提供了主键。 我试过它与异步和等待,但没有用,为什么发生?请帮我

+0

你可以添加数据库模式吗? –

+0

我们究竟是这么做的?是否需要添加我们自己的方法来更新SQLite.cs中的值? 我用var conn = new SQLiteConnection(“path”)然后conn.update(“Query”)。是的,它抛出异常,但更新数据库后,所以如果我发现异常,它适用于我。我知道它不是一个好这样做的方式,你能建议我这样做的有效方法。 –

+0

如果不知道数据库是如何制作的,很难诊断发生了什么。你可以把数据库模式放入你的问题吗? –

回答

4

关于你NotSupportedException问题 - 我怀疑你的模型缺少PrimaryKey属性:

public class MyModel 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    public int Tag { get; set; }   
    public string Foo { get; set; } 
} 

您需要上面的属性(S),即使你的数据库架构已经有了他们定义。目前,Sqlite-Net不从数据库读取模式数据。

一些其他的想法:

首先,你应该只使用两种同步sqlite的-Net的API,或异步API。不要同时使用两者。

我个人更喜欢同步API,因为它似乎更新。异步API在11个月内未更新,而同步API在4个月前更新。除此之外,我从来都无法弄清楚如何使用异步API进行交易。再次,这是个人偏好。

其次,QueryQueryAsync方法应该只用于查询(对于SELECT s)。他们不应该用于UPDATE s。要添加/更改数据,您需要使用这些同步方法:Execute,Update, Insert等。如果使用异步API,则会有异步对应方(ExecuteAsync等)。

请阅读Sqlite-Net Project page,因为在这里您可以找到许多有关一般API使用情况的有用信息。

+0

感谢您的帮助。我已经在我的模型中实现了[PrimaryKey,AutoIncrement]。我将按照您的建议同步使用它 –

相关问题