2013-10-07 5 views
0

Я занимаюсь разработкой приложения с использованием базы данных SQLite. У меня есть следующий код для получения базы данных всех значений.Android: ошибка курсора SQLite выше 1 МБ размера базы данных

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(); 
} 

Если размер базы данных превышает 1 МБ, приложение получает сбой. Как получить значения базы данных более 1 МБ?

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.

+4

Что такое авария? Можете ли вы опубликовать стек? –

+0

@GrahamBorland Я здесь вставлял информацию о logcat. – Karthick

+0

Зачем вам загружать всю базу данных в одну строку сразу? – njzk2

ответ

1

Ну, ясно, что у вас просто не хватает памяти. Вы создаете строковое представление базы данных, используя ряд неизменных объектов String.

String value=""; 

Каждый раз, когда вы делаете конкатенации, value=value +", \\\"" вы создаете новый объект String. Это очень неэффективно с точки зрения использования памяти.

Попробуйте с помощью StringBuilder вместо String, и использовать его метод append() вместо оператора конкатенации +. Это позволит построить строку в одном буфере (который будет расти по мере необходимости), что значительно сместит его в доступную память кучи.

+0

Я разрабатываю приложение, которое обычно вызывает собственный метод с помощью javascript. Этот метод возвращает строку json на страницу html. Вот почему у меня есть строковые манипуляции. Еще один пример: я прочитал несколько вопросов, которые описывают, размер курсора android составляет 1 МБ. Это правильно? – Karthick

+0

Есть ли предложения по этому сценарию? – Karthick

+0

Я не понимаю, о чем вы спрашиваете. Вы внесли предложенные изменения? Помогло ли это решить проблему? –

Смежные вопросы