异步任务

时间:2016-03-22 20:22:50

标签: android json sqlite cursor

我正在运行后台任务,下载并下载JSON文件,然后将其添加到SQLite数据库的内容中。

运行时我遇到了一些错误。

  

引起:android.database.CursorWindowAllocationException:Cursor   窗口分配2048 kb失败。 #Open Cursors = 728(#rsrsors   由此proc = 728打开

     

E / CursorWindow:无法分配CursorWindow   '/data/data/com.mycompany.inventory/databases/dbInventory.sql'的大小   2097152由于错误-12。

JSON中有大约1500个项目。

以下是我的异步任务调用的方法:

public void addModelsToDB(JSONObject dict){
        String  insertQuery  = "";
        String  deleteQuery  = "DROP TABLE IF EXISTS 'tblModels'";
        String  createQuery  = "CREATE TABLE 'tblModels' ('modelsID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,'makeKey' INTEGER, 'modelName' TEXT, 'modelKey' INTEGER)";

        Cursor cursor = dbLocals.executeRawQuery(deleteQuery, null);
        cursor.moveToFirst();
        cursor = dbLocals.executeRawQuery(createQuery, null);
        cursor.moveToFirst();

        try {
            JSONArray dicRecordSet  = dict.getJSONArray("Recordset");
            JSONObject dicRecords = dicRecordSet.getJSONObject(0);
            JSONArray arrRecords = dicRecords.getJSONArray("Record");


            for (int i = 0; i < arrRecords.length(); i++) {
                JSONObject record = arrRecords.getJSONObject(i);
                insertQuery = "INSERT INTO 'tblModels' VALUES(" + null +  ", "
                        + record.getString("MODMAKlMakeKey") + ", '"
                        + record.getString("MODvc50Name").replaceAll("'", "''") + "', "
                        + record.getString("MODlModelKey")
                        +")";
                cursor =  dbLocals.executeRawQuery(insertQuery, null);
                cursor.moveToFirst();
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        cursor.close();
    }

我的数据库管理员返回一个光标。

public Cursor executeRawQuery(String query, String[] selectionArgs) {
        Cursor cursor = databaseConn.rawQuery(query, selectionArgs);
        return cursor;
    }

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您无法重复使用游标变量,因为它会遮挡原始变量,因此无法关闭它:

Cursor cursor = dbLocals.executeRawQuery(deleteQuery, null);

然后

cursor =  dbLocals.executeRawQuery(insertQuery, null);

第二次分配意味着你无法关闭原始光标。

另外,你为什么要在这里创建表?

编辑:

像这样使用:

public void addModelsToDB(JSONObject dict){
    String  insertQuery  = "";
    String  deleteQuery  = "DROP TABLE IF EXISTS 'tblModels'";
    String  createQuery  = "CREATE TABLE 'tblModels' ('modelsID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,'makeKey' INTEGER, 'modelName' TEXT, 'modelKey' INTEGER)";

    Cursor cursor = dbLocals.executeRawQuery(deleteQuery, null);
    try {
        cursor.moveToFirst();
        cursor = dbLocals.executeRawQuery(createQuery, null);
        cursor.moveToFirst();
    } finally {
        cursor.close();
    }

    try {
        JSONArray dicRecordSet  = dict.getJSONArray("Recordset");
        JSONObject dicRecords = dicRecordSet.getJSONObject(0);
        JSONArray arrRecords = dicRecords.getJSONArray("Record");


        for (int i = 0; i < arrRecords.length(); i++) {
            JSONObject record = arrRecords.getJSONObject(i);
            insertQuery = "INSERT INTO 'tblModels' VALUES(" + null +  ", "
                    + record.getString("MODMAKlMakeKey") + ", '"
                    + record.getString("MODvc50Name").replaceAll("'", "''") + "', "
                    + record.getString("MODlModelKey")
                    +")";
            cursor =  dbLocals.executeRawQuery(insertQuery, null);
            try {
                cursor.moveToFirst();
            } finally {
                cursor.close();
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:-1)

使用后应关闭游标。在循环内部,您每次迭代都会创建一个游标,而不会关闭它。显然,打开游标的数量是有限制的,你达到了这个限制。