sql >> データベース >  >> RDS >> SQLite

SQLiteエラーに複数の行を挿入します(エラーコード=1)

    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を超えるユニオンを使用することはできません。



    1. Explainによって返される行がcount()と等しくないのはなぜですか?

    2. VisualStudioでMySQLデータソースに接続する方法

    3. MySQLでEntityFrameworkウィザードがクラッシュする

    4. OracleStreamsで伝搬を常に有効に保つ