0

Flash (AIR 3.6) で iPad アプリを作成しています。SQLite データベース エンジンを使用して大量のデータを同期する必要があります。データのベクトルに変換する必要がある JSON 形式でサーバーからデータを受信して​​います。

私が知る限り、Flash SQLite エンジンでは一度に 1 つの INSERT プロセスしか許可されていないため、1 つのクエリにできる限り追加することにしました。INSERT で UNION ALL を使用していますが、500 個のユニオンの制限に遭遇した後、SQLite エンジンは連携を拒否しました。

そのため、ユニオンを使用して最大 500 個の挿入を追加し、すべてのデータがそのように挿入されるまで実行する構造を作成する必要がありました。2k+ 行の場合、約 5 回ループします。データを 1 つずつ挿入しようとしましたが、現在の 300 倍の時間がかかりました。

最後に: AIR 3.6 プロジェクトの SQLite で 1 回のクエリで 500 行を超えるデータをデータベースに追加することは可能ですか?

編集:

1 つのトランザクションで多くの INSERT を使用すると、次のように機能しないようです。

var sql:String = "";
sql +=  "INSERT INTO TablicaTestowa (formTypeId,name,timestamp) VALUES ('abc2','nazwa2','sg535');"
sql +=  "INSERT INTO TablicaTestowa (formTypeId,name,timestamp) VALUES ('abc3','nazwa3','gwt5htbsd');"
sql +=  "INSERT INTO TablicaTestowa (formTypeId,name,timestamp) VALUES ('abc4','nazwa4','frtgwh3jwdsed');"
createStmt.text = sql;
createStmt.addEventListener(SQLEvent.RESULT, createResult2);
createStmt.addEventListener(SQLErrorEvent.ERROR, createError2);
createStmt.execute();

最初の値 ('abc2','nazwa2','sg535) のみを追加します。または多分私は何か間違ったことをしていますか?

4

2 に答える 2

0

INSERT単一のクエリを使用する必要はありません。INSERT複数の を 1 つのトランザクションにラップして、同様のパフォーマンスを得ることができます。

于 2013-03-30T16:37:28.433 に答える
0

もちろんできます!

public void putAll(Context context, LinkedList<HANDLEDOBJECT> objects) {
    if (objects.size() < 1 || objects.get(0) == null)
        return;
    Log.i("Database", "Starting to insert objects to " + getTableName());

    List<String> insertCommands = new ArrayList<String>();
    int t = 0;
    while (t < objects.size()) {
        int k = 0;
        StringBuilder sb = new StringBuilder();

        sb.append("INSERT OR REPLACE INTO ").append(getTableName())
                .append("('k', 'v') ");
        for (t = t + 0; t < objects.size() && k < 450; t++) {
            k++;
            if (t % 450 != 0)
                sb.append("UNION ");
            sb.append("SELECT " + objects.get(t).getId())
                    .append(" AS k, ")
                    .append("'"
                            + GsonSerializer.getInstance().toJson(
                                    objects.get(t), getHandledObjectType())
                            + "'").append(" AS v ");

        }

        insertCommands.add(sb.toString());
    }

    for (String insertCommand : insertCommands)
        SQLiteClient.getConnetion(context).execSQL(insertCommand);

    Log.i("Database", "Successfully inserted " + t + " objects to "
            + getTableName() + "!!!");
}
于 2013-09-27T14:02:24.693 に答える