0

SQLite.Net-PCLパッケージを削除したいのですが、sqlite-net-pclを使用したいのは、後でSQLite.Net-PCLが正式に維持されていないことが判明したためです。sqlite-net-pclのinsertAllとUpdateAll SQLite.Net-PCLのInsertOrReplaceAll

私のXamarinプロジェクトには、GUIDを文字列型の主キーとして格納するテーブルがあります。私は、サーバーから来て、現在InserOrReplaceAllメソッドを使用して、新しいレコードを挿入して既存のレコードを更新するリストを、私のGUID主キーに基づいてまとめて更新しています。

さて、sqlite-net-pclInsertOrReplaceAllメソッドを持っていないが、代わりにそれだけでInsertAll & UpdateAllメソッドを持っています。 Microsoft msdn Linkは、主キーが使用可能かどうかをチェックし、それに基づいてレコードを挿入または更新する必要があるかどうかを判断します。

しかし、主キーの値は、オブジェクトを挿入または更新する前にListに常にプリセットされています。レコードが存在するかどうかを確認するループを作成したくない場合があります。

挿入する方法この場合、すべてのレコードを一度に置き換えますか?

は、このシナリオを理解するために例を次の点を考慮

using (var conn = new DBConnectionService().GetConnection()) 
{  
    List<ENTEmployee> employees = new List<ENTEmployee>() 
    { 
     new ENTEmployee(){ Id = "b977ec04-3bd7-4691-b4eb-ef47ed6796fd", FullName = "AAA BBB", Salary = 15000 }, 
     new ENTEmployee(){ Id = "c670a3e2-b13f-42b3-849c-fd792ebfd103", FullName = "BBB BBB", Salary = 16000 }, 
     new ENTEmployee(){ Id = "d961c33c-0244-48dc-8e10-f4feb6", FullName = "CCC BBB", Salary = 17000 }, 
     new ENTEmployee(){ Id = "35be4508-ff93-4be8-983f-d4908bcc592d", FullName = "DDD BBB", Salary = 18000 }, 
     new ENTEmployee(){ Id = "0875549c-d06c-4983-b89a-edf81b6aa70d", FullName = "EEE BBB", Salary = 19000 }, 
    }; 

    var insertResult = conn.InsertAll(employees); 

    //Updated Record 
    employees[0].FullName = "AAA Updated"; 
    employees[0].Salary = 12300; 


    //New Records 
    employees.Add(new ENTEmployee() { Id = "87f48ecf-715c-4327-9ef3-11712ba4a120", FullName = "FFF BBB", Salary = 20000 }); 
    employees.Add(new ENTEmployee() { Id = "85f53888-b1e9-460c-8d79-88010f143bcf", FullName = "GGG BBB", Salary = 21000 }); 

    //Now here, 
    //How to decide which records to be inserted and which records to be updated for List employees? 
} 
+0

私は/ここに特色の問題を要求しています。https:// githubの。 com/praeclarum/sqlite-net/issues/652 – MilanG

答えて

0

この場合には、一度にすべての私のレコードを挿入または置換する方法は?あなたの記録のリストを横断し、リスト内のすべてのオブジェクトに対してconn.InsertOrReplace(object)を使用

  1. :用

    (従業員でENTEmployeeのEMP) { problemLを解決するには2つの方法があります

conn.InsertOrReplace(emp); }

  • 使用するSQLは、(コマンド文字列を構築するためにあなたを必要とする)レコードを挿入または置換するコマンド:

    string cmd = @"insert or replace into employ(id,FullName,salary) 
           values('c670a3e2-b13f-42b3-849c-fd792ebfd103', 'fullname1',32), 
            ('d961c33c-0244-48dc-8e10-f4feb6', 'fullname2',23);"; 
    conn.Execute(cmd); 
    
  • +0

    解決策1は、好きではない私のすべてのレコードをループしています。何千ものレコードがある場合を考えてみましょう。私はループなしですべてをやり遂げることができるかどうかを知りたい。ソリューション2はコマンドだけで大きな文字列を生成するのにも適していません。 – MilanG

    +1

    これらの2つのソリューションが欲しいのではない場合は、今すぐ見ることができる唯一のソリューションは、sql-net-pclの作成者に関数を追加するよう依頼することです。 'sql-net-pcl'の[github site](https://github.com/praeclarum/sqlite-net)で問題を開くことができます。 –

    +0

    ええ、それは私が一瞬前に考えていたものです。 InsertOrReplaceAllは、このような場合に私たちのためにすべてをやっていた古いSQLite.NET PCLの非常に良いメソッドでした。 – MilanG

    関連する問題