2014-09-02 57 views
1

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

我有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); 
    } 
} 

回答

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); 
} 

}

这应该工作,因为它只会将第二表的id保存在intermediateTable中。所以你不需要请求数据库来填充第二个表的所有字段。

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

所以,你将使用callBatchTasks方法,允许增加速度ORMLite。

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

如果你想callBatchTasks方法的一个例子。你可以看看这里: Android ORMLite slow create object

+0

这工作。谢谢! – 2014-09-10 17:39:40