2

この例では、SQLite データベース内に保存される次のクラスを定義しました。

[SQLite.AutoIncrement, SQLite.PrimaryKey, SQLite.Indexed]
public int ID { get; set; }
[SQLite.Indexed]
public string ImageName { get; set; }

sqlite-net で提供されている挿入コマンドを使用していますが、動作します。

SQLiteAsyncConnection CurrentConnection = new SQLiteAsyncConnection("DB");
int result = await CurrentConnection.InsertAsync(this);

その後、SQLite DB からデータを選択しようとしています。

List<Image> result = new List<Image>();
if (ImageName != null)
{
    query = CurrentConnection.Table<Image>().Where(i => i.ImageName == ImageName);
    result = await query.ToListAsync();
}
if (ID != null && ID > 0)
{
    query = CurrentConnection.Table<Image>().Where(i => i.ID == ID);
    result = await query.ToListAsync();
}
if (result.Count > 0)
{
    LoadFromResult(result[0]);
    return;
}

ImageName で選択すると、すべてがうまく機能し、必要な結果が得られます。ただし、ID で選択しようとすると、結果が選択されません。

指定されたIDの画像が存在することはわかっています。挿入して後でIDを確認したばかりなので、何らかの理由でこれが機能しません。

私は完全に盲目で、ここにある小さな文字を見逃したのでしょうか? SQLite-net を使用して主キーで選択しようとした人はいますか?

//編集

これも試しましたが、うまくいきませんでした:

var query1 = await CurrentConnection.QueryAsync<Image>("select * from Image where ID = ?", ID);
if (query1.Count > 0)
{
    LoadFromResult(query1[0]);
    return;
}

//編集2

画像を挿入すると、ID が何らかの ID に設定されますが、DB 内のすべての画像を選択すると、すべての画像の ID が 0 になります。

なぜこれが起こるのかについて何か考えはありますか?

4

1 に答える 1

1

あなたの問題はあなたのクラスのAutoIncrement属性にあるのではないかと思います。AutoIncrement属性を削除してみて、idで画像が見つかるかどうかを確認してください。

何が起こっているのかというと、AutoIncrement属性がIdを設定し、作成したIDをオーバーライドしていると思います。

例えば

MyImageのインスタンスを次のように作成するとします。

MyImage i = new MyImage(){Id = 5、ImageName = "imageName"}

(空のテーブルで)CurrentConnection.InsertAsync(i)を実行すると、データベースに挿入されたエントリのIDは5ではなく1になります。

お役に立てば幸いです

于 2012-12-14T19:13:34.953 に答える