如何可以非常有效地将来自服务器的批量json数据插入到Android中的Sqlite数据库中。我现在使用的方法效率很低,完成约2000条记录的插入需要几分钟。我遵循的方法是:
for (int i = 0; i < jsonObj.length(); i++)
{
JSONObject itemObj = (JSONObject) jsonObj.get(i);
ContentValues value1 = new ContentValues();
ContentValues value2 = new ContentValues();
value2.put(DbHelper.BusinessID,itemObj.getString("BusinessID"));
value2.put(DbHelper.LocationID,itemObj.getString("LocationID"));
JSONArray list = itemObj.getJSONArray("OfficeDetails");
if (list != null)
{
for (int k = 0; k < list.length(); k++)
{
JSONObject elem = list.getJSONObject(k);
if (elem != null)
{
try
{
value1.put(DbHelper.Office_Code,elem.getInt("Office_Code"));
value1.put(DbHelper.Office_District,elem.getInt("Office_District"));
db.insert(DbHelper.MessageDetail,null, value1);
}
catch (Exception e)
{
e.printStackTrace();
}
}
db.insert(DbHelper.Message,null, value2);
}
即将推出的输入是一个嵌套的Json数组,它本身是嵌套的。有没有更好的方法在很短的时间内快速插入大量数据?
答案 0 :(得分:0)
您可以尝试bulkInsert
,如下所示:
ContentResolver.bulkInsert (Uri url, ContentValues[] values); //Array of rows to be inserted
这仅适用于您只使用1个URI的情况,如果您要使用多个uris,则应在applyBatch
中使用ContentResolver
方法。
希望有所帮助
答案 1 :(得分:0)
首先创建json数据的模型类。使用Gson,您可以在arraylist中获取数据。然后你可以使用那个arraylist将数据插入到sqlite中。 GreenDao是您快速表现的最佳选择。
当您在流中收到json数据时,请使用以下代码:
Type collectionType = new TypeToken<ArrayList<your_model>>() {}.getType();
Gson gson = new Gson();
ArrayList<your_model> yourModelList = gson.fromJson(stream, collectionType);
答案 2 :(得分:0)
Github中有一个名为JSQL的优秀库。
https://github.com/wenchaojiang/JSQL
它可以很容易地将Persist JSON字符串和JSON对象保存到SQLite数据库中。
答案 3 :(得分:-1)
创建json数据列表,然后将此自定义查询用于批量数据插入:
/**
* insert the bulk data into database
*
* @param query to insert data into table
* @param parameter data to be inserted into table
* @return number of rows got inserted
*/
protected int insertBulk(String query, String[][] parameter) throws SQLiteConstraintException, SQLiteException {
int rowCount = -1;
SQLiteStatement statement = mSqldb.compileStatement(query);
mSqldb.beginTransaction();
try {
for (int index = 0; index < parameter.length; index++) {
statement.bindAllArgsAsStrings(parameter[index]);
statement.execute();
statement.clearBindings();
}
rowCount = parameter.length;
} finally {
mSqldb.setTransactionSuccessful();
mSqldb.endTransaction();
}
return rowCount;
}