以前はSQLiteを使用していましたが、Insert in aloopを使用して複数の行を追加するのfor
は時間がかかりました。解決策はを使用していましたtransaction
。
SQLiteAsyncConnection
SQLite.Net(ORM用)で使用しているので、も使用しようとしましたtransaction
。それは機能しますが、問題は1つだけです。挿入順序はデータの順序ではありません。
Database.RunInTransactionAsync(
(SQLiteConnection conn) => {
foreach (var row in rows)
{
conn.InsertOrReplace(row);
}
conn.Commit();
}
);
rows
[1,2,3,4,5,6]が含まれている場合、データベースの行は[3,1,2,6,4,5]のようになります。元の注文を維持するにはどうすればよいですか?
新しく挿入された行のみを意味することに注意してください。コードが既存の行を置き換えているとはいえ、テスト時に、データベースに置き換えられる既存の行はありませんでした。
PS:行が有しID
ているフィールド[PrimaryKey]
が、中rows
列によってソートされていませんID
。データベースでは、行はID
。でソートされているようです。並べ替えたくはありませんID
が、元の順序を維持します。
PS 2:ID
最後に挿入された行を知る必要があります。のようなGUIツールを使用してデータベースを表示しDB Browser for SQLite
たり、最後の項目をで取得したりLIMIT 1
すると、SQLiteは自動的に行をで並べ替えたようID
です。Googleで検索したところ、SQLのルールによると、がない場合ORDER BY
、返される行の順序は、とにかく物理的な順序であるとは限りません。別のフィールドを作成して、それをプライマリの自動増加フィールドとして設定する必要がありますか?
現在、ID
行ごとに一意であることが保証されていますが、「ID」はデータ自体の一部であり、データベースで使用するために特別に追加されたフィールドではありません。
SQLテーブルは論理的に順序付けされていないため、特定の順序が必要な場合は、クエリで常にORDERBYを使用する必要があります。
データに挿入順序に対応する値(タイムスタンプなど)が含まれていない場合は、ROWIDを使用する必要があります。つまり、INTEGER PRIMARYKEYとして宣言された列を追加します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加