2017-11-05 13 views
1

以前はSQLiteを使用していましたが、forループの挿入を使用して複数の行を追加するのは遅かったです。解決策はtransactionを使用していました。複数の行を順番に挿入するSQLiteAsyncConnection?

SQLite.Net(ORM用)にSQLiteAsyncConnectionを使用していますので、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:行が[PrimaryKey]あるIDフィールドを有するが、rowsの行はIDによってソートされていません。データベースでは、行はIDでソートされているようです。私はIDでソートするのではなく、元の順序を維持することを望んでいます。

PS 2:最後に挿入された行のIDを知る必要があります。 DB Browser for SQLiteのようなGUIツールを使用してデータベースを表示したり、最後の項目をLIMIT 1で取得すると、SQLiteは自動的に行をIDでソートしたようです。私はいくつかのGoogleの検索を行い、それはORDER BYがない場合、SQLのルールによって返された行の順序は、とにかく物理的な順序であることは保証されていないと述べた。別のフィールドを作成し、それをプライマリの自動増加フィールドとして設定する必要がありますか?

現在、IDは行ごとに一意であることが保証されていますが、 'ID'はデータ自体の一部であり、データベースと共に使用するために特別に追加されたフィールドではありません。

答えて

0

SQLテーブルが論理的に順序付けられていないので、特定の順序が必要な場合は、常にクエリでORDER BYを使用する必要があります。

データに挿入順序に対応する値(タイムスタンプなど)が含まれていない場合は、rowidを使用する必要があります。つまり、INTEGER PRIMARY KEYとして宣言された列を追加する必要があります。

関連する問題