【问题标题】:Insert JSON to SQLite table on Android在 Android 上将 JSON 插入 SQLite 表
【发布时间】:2017-02-21 12:10:00
【问题描述】:

我有一个 JSONObject :

{"Table1":[{"row1":"1","B":"2"},{"row2":"1","B1":"2"}],"Table2":[{"C":"1","D":"1145"},{"C":"1","D":"1145"}],"Table3":[{"E":"62","F":"1"},{"C":"1","D":"1145"}]}

如何插入 sqlite foreach 表?

现在使用这个代码:

 for (Iterator<String> iterator = mJson.keys(); iterator.hasNext(); ) {
                    String tableName = iterator.next();
                    if (mJson.optJSONArray(tableName) != null) {
                        resetTable(tableName);
                        JSONArray tableArray = mJson.optJSONArray(tableName);
                        for (int i = 0; i < tableArray.length(); i++) {
                            JSONObject tableData = tableArray.getJSONObject(i);
                            ContentValues Values = new ContentValues();
                            for (Iterator<String> iter = tableData.keys(); iter.hasNext(); ) {
                                String key = iter.next();
                                Values.put(key, tableData.get(key).toString());
                            }
                            db.insert(tableName, null, Values);
                        }
                    }
                }

但我想要最快更好的方法

【问题讨论】:

  • 您是否从这段代码中得到了一些错误?
  • 不,我没有错误,但是处理时间很长..

标签: android json android-sqlite


【解决方案1】:

使用批量插入:

for (Iterator<String> iterator = mJson.keys(); iterator.hasNext(); ) {
    String tableName = iterator.next();
    if (mJson.optJSONArray(tableName) != null) {
        resetTable(tableName);
        String sql = "INSERT INTO " + tableName + " VALUES (?);";
        SQLiteStatement statement = db.compileStatement(sql);
        db.beginTransaction();
        JSONArray tableArray = mJson.optJSONArray(tableName);
        for (int i = 0; i < tableArray.length(); i++) {
            JSONObject tableData = tableArray.getJSONObject(i);
            for (Iterator<String> iter = tableData.keys(); iter.hasNext(); ) {
                String key = iter.next();
                statement.clearBindings();
                statement.bindString(1,tableData.get(key).toString());
                statement.execute();
            }
        }
        db.setTransactionSuccessful();
        db.endTransaction();
    }
}

【讨论】:

    【解决方案2】:

    您可以将 ContentValues 与 beginTransaction 一起使用到 SQLite 中,这非常简单并且比准备好的语句更快

    为此,您必须事先创建 ContentValues 数组或在循环中创建 Content 值对象。并传入 insert 方法。此解决方案可同时解决您的两个问题。

    mDatabase.beginTransaction();
        try {
            for (ContentValues cv : values) {
                long rowID = mDatabase.insert(table, " ", cv);
                if (rowID <= 0) {
                    throw new SQLException("Failed to insert row into ");
                }
            }
            mDatabase.setTransactionSuccessful();
            count = values.length;
        } finally {
            mDatabase.endTransaction();
        }
    

    您只能传递内容值对象,例如 for 循环和插入,并且在上面的代码中使用了事务,因此它将加速数据库存储。

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多