【发布时间】:2013-10-10 20:39:25
【问题描述】:
我正在使用 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:
使用字符串缓冲区的代码
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。
【问题讨论】:
-
什么是崩溃?你可以发布堆栈跟踪吗?
-
@GrahamBorland 我这里粘贴了logcat信息。
-
为什么需要一次将所有数据库加载到1个字符串中?
-
我需要执行SELECT_ALL查询并将游标转换为json数据。这是我的要求。而不是像这样使用字符串或字符串缓冲区,我该如何实现呢?
标签: android android-sqlite android-cursor