Не удалось выделить 83070912 байт с 25165824 свободными байтами и 34 МБ до OOM, максимально допустимый объем памяти 525798800, предел роста 536870912 - PullRequest
1 голос
/ 31 октября 2019

Я действительно застрял. Я знаком с разработками на Java и Android, но у меня нет опыта работы с базами данных.

public ArrayList<String> getIstilah(int dicType){
    String tableName = getTableName(dicType);
    String q = "SELECT * FROM "+tableName;
    Cursor result = sDB.rawQuery(q, null);

    ArrayList<String> source = new ArrayList<>();
    while (result.moveToFirst()){
        source.add(result.getString(result.getColumnIndex(COL_JUDUL)));// line 97
    }
    return source;
}

2019-10-31 16: 36: 16.881 2267-2267 /? E / Zygote: isWhitelistProcess - процесс занесен в белый список 2019-10-31 16: 36: 16,884 2267-2267 /? E / Zygote: accessInfo: 1 2019-10-31 16: 36: 42.843 2267-2267 / id.AntBeeDev.ContohKamus E / AndroidRuntime: FATAL EXCEPTION: main Процесс: id.AntBeeDev.ContohKamus, PID: 2267 java.lang.Outrfemory: Не удалось выделить 83070912 байт с 25165824 свободными байтами и 34 МБ до OOM, максимально допустимый размер 525798768, ограничение роста 536870912 в java.util.Arrays.copyOf (Arrays.java:3139) в java.util.Arrays.copyOf (массивы.java: 3109) в java.util.ArrayList.grow (ArrayList.java:275) в java.util.ArrayList.ensureExplicitCapacity (ArrayList.java:249) в java.util.ArrayList.ensureCapacityInternal (ArrayList.java:241)в java.util.ArrayList.add (ArrayList.java:467) в id.AntBeeDev.ContohKamus.DBHelper.getIstilah (DBHelper.java:97) в id.AntBeeDev.ContohKamus.MainActivity.onCreateOptionsMj (android.app.Activity.onCreatePanelMenu (Activity.java:3568) в androidx.fragment.app.FragmentActivity.onCreatePanelMenu (FragmentActivity.java:325) в androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu (WindowCallbackWrapper.java:94) в androidx.appcompat.app.AppCompatDelegateImpl $ AppCompatWindowCallback.onCreatePanelMenu (AppCompatDelegateImpl.java:28.appl.Wack.Wack.WackWack.WeckWack.WebWRAP.app.ToolbarActionBar.populateOptionsMenu (ToolbarActionBar.java:455) в androidx.appcompat.app.ToolbarActionBar $ 1.run (ToolbarActionBar.java:56) в android.os.Handler.handleCallback (Handler.java:8os at и Handler.java:873 at).Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:214) на android.app.ActivityThread.main (ActivityThread.java:7078) на java.lang.reflect.Method. invoke (Собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:494) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)

1 Ответ

2 голосов
/ 31 октября 2019

Вы получаете курсор и переходите к первой строке, добавляете данные в массив, затем перемещаетесь к первой строке и добавляете данные НАВСЕГДА (если запросом извлечена 1 или более строк).

Вы должны использовать moveToNext , а не moveToFirst (который будет первоначально перемещаться в первую строку, так как курсор изначально расположен на перед первой строкой (позиция -1) ) Например: -

while (result.moveToNext()){
    source.add(result.getString(result.getColumnIndex(COL_JUDUL)));// line 97
}
result.close(); //<<<<<<<<<< SHOULD ALWAYS CLOSE CURSORS WHEN DONE WITH THEM
return source;
...