2013-07-03 51 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]。我將按照您的建議同步使用它 –

相關問題