Android:SQLite游标错误超过1 MB的数据库大小

时间:2013-10-07 10:57:25

标签: android android-sqlite android-cursor

我正在使用SQLite数据库开发应用程序。我有以下代码来获取数据库的所有值。

ArrayList<String> values=new ArrayList<String>(); 
String[] ColumnNames;
String selectQuery="SELECT * FROM "+tableName;
Cursor cursor=sDataBase.rawQuery(selectQuery, null);
if(cursor!=null && cursor.getColumnCount()>0 && cursor.getCount()>0){
    ColumnNames=cursor.getColumnNames();
    if (cursor.moveToFirst()){
        do{
            String value="";
            for(int i=0;i<cursor.getColumnCount();i++){
                if(value!="")
                    value=value +", \\\""+ColumnNames[i]+"\\\":\\\"" + cursor.getString(i)+"\\\"";
                else
                    value= "\\\""+ ColumnNames[i] +"\\\":\\\"" + cursor.getString(i) +"\\\"";
            }
            value="{" + value + "}";
            values.add(value);
        }while(cursor.moveToNext());
    }
    cursor.close();
}

如果数据库大小超过1MB,则应用程序崩溃。如何使数据库值超过1 MB。?

EDIT1:

Logcat值:

10-10 14:46:24.863: E/dalvikvm-heap(3248): Out of memory on a 6612888-byte allocation.

EDIT2:

使用stringbuffer的代码

   if(cursor!=null && cursor.getColumnCount()>0 && cursor.getCount()>0)
            {
                ColumnNames=cursor.getColumnNames();
                if (cursor.moveToFirst()){
                       do{
                           StringBuffer value= new StringBuffer();
                            value.append("{");
                           for(int i=0;i<cursor.getColumnCount();i++)
                           {
                               if(value.length()>1)
                                   value.append(", \\\""+ColumnNames[i]+"\\\":\\\"" + cursor.getString(i)+"\\\"");
                               else
                                  value.append("\\\""+ ColumnNames[i] +"\\\":\\\"" + cursor.getString(i) +"\\\"");
                           }
                           value.append(value + "}");
                           values.add(value);
                       }while(cursor.moveToNext());
                    }
                    cursor.close();
            }

值StringBuffer的长度为4860024。

1 个答案:

答案 0 :(得分:1)

嗯,显然你的内存已经不足了。您正在使用一系列不可变String对象构建数据库的String表示。

String value="";

每次进行字符串连接时,value=value +", \\\""都会创建一个新的String对象。就内存使用而言,这是非常低效的。

尝试使用StringBuilder而不是String,并使用其append()方法而不是字符串连接运算符+。这将允许字符串在单个缓冲区中构建(根据需要增长),这使得它更有可能适合可用的堆内存。