如何在Android中批量从Json插入到Sqlite

时间:2014-10-16 06:07:35

标签: android sql json sqlite

如何可以非常有效地将来自服务器的批量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数组,它本身是嵌套的。有没有更好的方法在很短的时间内快速插入大量数据?

4 个答案:

答案 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;
}