0

我正在 Flash (AIR 3.6) 中创建 iPad 应用程序。我需要使用 SQLite 数据库引擎同步大量数据。我正在从服务器接收 JSON 格式的数据,需要将其转换为数据向量。

据我所知,Flash SQLite 引擎一次只允许 1 个 INSERT 进程,因此我决定在 1 个查询中添加尽可能多的内容。我将 UNION ALL 与 INSERT 一起使用,但我遇到了 500 个联合的限制,之后 SQLite 引擎拒绝合作。

因此,我必须创建一个结构,该结构最多可添加 500 个带有联合的插入并运行,直到所有数据都以这种方式插入。对于 2k+ 行,它循环大约 5 次。我试图逐个插入数据,但它花费了现在的 300 倍。

最后:在 AIR 3.6 项目中的 SQLite 中,是否可以在 1 次查询中将超过 500 行的数据添加到数据库中?

编辑:

在一个事务中使用许多 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查询;您可以将多个 s 包装INSERT到一个事务中以获得相似的性能。

于 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 回答