首页 > 解决方案 > 未能分配 83070912 字节分配,其中 25165824 空闲字节和 34MB 直到 OOM,最大允许占用空间 525798800,增长限制 536870912

问题描述

我真的被困住了。我熟悉 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:致命异常:主进程:id.AntBeeDev.ContohKamus,PID:2267 java.lang.OutOfMemoryError :无法分配 83070912 字节分配,其中 25165824 个可用字节和 34MB 直到 OOM,最大允许占用空间 525798768,增长限制 536870912 在 java.util.Arrays.copyOf(Arrays.java:3139) 在 java.util.Arrays.copyOf(Arrays .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:

标签: androidsqliteandroid-sqlite

解决方案


您获得光标并移动到第一行将数据添加到数组中,然后移动到第一行并永远添加数据(只要查询已提取了 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;

推荐阅读