13

ここから sqlite.net の PCL バージョンを使用しています ( https://github.com/oysteinkrog/SQLite.Net-PCL )。

これが私の単純なクラスです。

    public class LogEntry
    {
      [PrimaryKey, AutoIncrement]
      public int Key { get; set;}
      public DateTime Date { get; set; }
    }

LogEntry の新しいインスタンスが作成されると、キーは自動的に 0 に設定されます。日付を何かに設定してから、InsertOrReplace を呼び出します。レコードはデータベースに保存されます。Key フィールドは、最初のレコードであるため、たまたま 0 になる自動インクリメント値を取得します。

次に、LogEntry の新しいインスタンスを作成し (Key は自動的に 0 に初期化されます)、日付を別の値に設定します。次に、InsertOrReplace を呼び出します。Key が 0 の既存のレコードがあるため、そのレコードが更新されます。

これに対処する適切な方法は何ですか?キーを -1 に初期化することを検討しましたが、それもうまくいかないようでした。

誰かがこの作業の例を持っていますか?

4

6 に答える 6

29

Key を null 許容型 (int?) に変更すると、機能するはずです。その後、SQLite は null が入ってくるのを見て、必要に応じて新しい ID を生成します。

public class LogEntry
    {
      [PrimaryKey, AutoIncrement]
      public int? Key { get; set;}
      public DateTime Date { get; set; }
    }
于 2015-02-24T19:35:06.257 に答える
10

あなたが説明しているのと同じ問題が発生しました。試す

var rowsAffected = Connection.Update(object);
if(rowsAffected == 0) {
    // The item does not exists in the database so lets insert it
    rowsAffected = Connection.Insert(object);
}
var success = rowsAffected > 0;
return success;

上記を試したところ、期待どおりに動作します

于 2014-08-27T10:32:55.767 に答える
0

InsertOrReplace は必要ありません。

InsertAsync を待ちます。

動作保証...

    if (object.ID != 0)
    {
      // Update an existing object.
      var T = DatabaseAsyncConnection.UpdateAsync(object);
      T.Wait();
      return T;
    }
    else
    {
      // Save a new object.
      var T = DatabaseAsyncConnection.InsertAsync(object);
      T.Wait();
      return T;
    }
于 2021-11-05T10:35:18.197 に答える