SQLiteエラーに複数の行を挿入
私はあなたのアプローチが本当に好きではありません。それはとてもハードコアで、スパゲッティコードのように見えます。また、1つの挿入には1つの値しか持てないため、このアプローチは機能しません。 。 API insert()
を使用するのはどうですか 挿入用に直接設計した方法?
また、速度のパフォーマンスとセキュリティの観点から、TRANSACTION
を使用することをお勧めします 同じように。しかし、特にあなたのためにいくつかのコードを書きに行きましょう。
public void insertMultiple(List<Contact> contacts) {
Contact c = null;
ContentValues values = new ContentValues();
try {
if (db != null) {
db.beginTransaction();
for (Contact c: contacts) {
values.put(SQLConstants.FIRSTNAME, c.getFirstName());
values.put(SQLConstants.LASTNAME, c.getLastName());
...
db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
values.clear();
}
db.setTransactionSuccessful();
}
}
finally {
if (db != null && db.inTransaction()) {
db.endTransaction();
}
}
}
注:
お気づきのとおり、連絡先というテーブルがあります したがって、独自のオブジェクト連絡先を作成することをお勧めします これは、オブジェクトのプロパティがテーブルの列と等しいアプリケーション層のテーブルを表します。このアプローチを使用することをお勧めします。理由は次のとおりです。
- これはspagetthiコードではありません
- かなり高速です
- はるかに安全です
最後にいくつかの提案:
execSQL()
悪くはありませんが、一般的にはSQLiteOpenHelper
を作成するときにのみ使用しています。 テーブルを作成、削除、および変更するためのサブクラス。使用法はかなり適しています。ただし、主な推奨事項は次のとおりです。
- トランザクションの使用法を挿入、更新、削除するときは常に、速度パフォーマンスの向上(特に多数の行を挿入する場合)を除いて、データベースでの作業がはるかに安全であるため、常に非常に良い方法です。
情報のみ: SQLiteに1000、10000、100 000行を挿入したときにいくつかのテストを行いましたが、100000行の挿入には55,346しかかかりませんでした。 秒。トランザクションなしで1,000行を挿入するには、 73,398もかかりました。 秒。
- 1つ以上のテーブルから選択、挿入、更新するたびに、プレースホルダーを使用します つまり、パラメータ化されたステートメントであり、ハードコーディングされていません。これにより、クエリはより安全に、より速く、より人間が読める形式になります。結合する場合は、常に結合句を使用してください。選択できるのが最善です。
更新:
これがあなたのコードを動かしています:
insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status)
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , '[email protected]' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
更新2:
@Korniltsev AnatolyがSQLiteで指摘したように、SQLITE_MAX_COMPOUND_SELECT
という制約があります。 つまり、一度に500を超えるユニオンを使用することはできません。