优化OrmLite多对多代码

时间:2014-09-02 20:23:58

标签: ormlite

我正在解析一个JSON文件,用OrmLite在数据库中生成行和关系。使用以下代码,解析所有内容大约需要20多分钟。有什么方法可以优化它以减少时间吗?

我有3张桌子构成了多对多的关系。

public class FirstTable {
    int id;
    ForeignCollection<IntermediateTable> intermediateTables;
}

public class IntermediateTable {
    int id;
    FirstTable firstTable;
    SecondTable secondTable;
}

public class SecondTable {
    int id;
    ForeignCollection<IntermediateTable> intermediateTables;
}

在创建并填充第一个和第二个表之后,我正在解析一个JSON文件以创建FirstTable和SecondTable之间的关系。 JSON文件存储FirstTable对象的集合以及相关SecondTable条目的ID。

我的代码看起来像这样:

setForeignRelations(JSONObject jsonObject, FirstTable firstTable) {

    JSONArray secondTables = jsonObject.getJSONArray(SECOND_TABLE_KEY);

    for (int i = 0; i < secondTables.length(); i++) {
        int secondTableId = ((Integer)secondTables.get(i)).intValue();

        SecondTable secondTable = DbManager.getInstance().getHelper().getSecondTableDao().queryForId(secondTableId);

        IntermediateTable intermediateTable = new IntermediateTable();

        intermediateTable.setFirstTable(firstTable);
        intermediateTable.setSecondTable(secondTable);

        DbManager.getInstance().getHelper().getIntermediateTableDao().create(intermediateTable);
    }
}

1 个答案:

答案 0 :(得分:0)

我从不尝试过,但这可能会更快,应该可行:

setForeignRelations(JSONObject jsonObject, FirstTable firstTable) {

JSONArray secondTables = jsonObject.getJSONArray(SECOND_TABLE_KEY);

for (int i = 0; i < secondTables.length(); i++) {
    int secondTableId = ((Integer)secondTables.get(i)).intValue();

    IntermediateTable intermediateTable = new IntermediateTable();

    intermediateTable.setFirstTable(firstTable);
    intermediateTable.setSecondTable(new SecondTable(secondTableId));

    DbManager.getInstance().getHelper().getIntermediateTableDao().create(intermediateTable);
}

}

这应该有效,因为它只会在secondTable中保存secondTable的id。因此,您不必请求数据库填充第二个表的所有字段。

如果你想让它再次变快,你可以看看这里加速你的对象插入: ORMLite's createOrUpdate seems slow - what is normal speed?

因此,您将使用允许在ORMLite中提高速度的callBatchTasks方法。

通过这两件事,你可以提高SELECT的速度(因为你不再这样做了)和使用callBatchTasks方法的INSERT。

如果您想要callBatchTasks方法的示例。你可以看看这里: Android ORMLite slow create object

相关问题