2

WindowsストアアプリケーションでSQLiteを扱っています。使用してテーブルの値を更新しています

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

表にプライマリキーを提供したところで、プライマリキーを取得できないと思うからです。async と await で試してみましたが、使用できません。なぜそれが起こっているのですか? 私を助けてください

4

1 に答える 1

5

あなたの問題について- 私はあなたのモデルに属性NotSupportedExceptionが欠けていると思われます:PrimaryKey

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

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

db スキーマで既に定義されている場合でも、上記の属性が必要になります。この時点で、Sqlite-Net はデータベースからスキーマ データを読み取りません。

その他の考え:

まず、同期 Sqlite-Net API または非同期 API のみを使用する必要があります。両方を使用しないでください。

個人的には、より最新のように見える同期 API を好みます。非同期 API は 11 か月間更新されていませんが、同期 API は 4 か月前に更新されました。これに加えて、非同期 API を使用してトランザクションを行う方法を理解できませんでした。繰り返しますが、これは個人的な好みです。

第 2 に、Queryandメソッドはクエリ ( s の場合)QueryAsyncにのみ使用する必要があります。SELECTsには使用しないでくださいUPDATE。データの追加/変更にはExecuteUpdateInsert、 などの同期メソッドを使用する必要があります。非同期 API を使用する場合は、対応する非同期メソッド ( ExecuteAsync、など) があります。

Sqlite-Net プロジェクト ページをお読みください。一般的な API の使用法に関する多くの役立つ情報が記載されています。

于 2013-07-03T16:55:33.523 に答える