java - 如何解决 OrmLite 中巨大的 byte[] 问题

标签 java android sqlite ormlite

我有 2 个表头和二进制表

标题类似于:

@DatabaseTable(tableName = Header.TABLE_NAME)
public class Header extends Table {
    @DatabaseField(
            generatedId = true,
            columnName = HEADER_ID,
            dataType = DataType.LONG_OBJ
    )
    private Long id;

    @ForeignCollectionField(orderColumnName = Binary.BINARY_ORDER, orderAscending = true)
    private Collection<Binary> binaries=new ArrayList<Binary>();
}

二进制是:

@DatabaseTable(tableName = Binary.TABLE_NAME)
public class Binary {
    @DatabaseField(
            generatedId = true,
            columnName = BINARY_ID,
            dataType = DataType.LONG_OBJ)
    private Long id;

    @DatabaseField(
            columnName = BINARY_HEADER_ID,
            foreign = true,
            foreignAutoCreate = true,
            foreignAutoRefresh = true,
            //uniqueCombo = true,
            canBeNull = false, //there always must be a link to Item._ID
            columnDefinition = "integer constraint fk_4 references `"+ Header.TABLE_NAME+"`(`"+ Header.HEADER_ID+"`) on delete cascade"
    )
    private Header header=null;

    @DatabaseField(
            columnName = BINARY_ORDER,
            //uniqueCombo = true,
            canBeNull = false,
            dataType = DataType.INTEGER_OBJ,
            defaultValue = "0"
    )
    private Integer order =0;

    @DatabaseField(
            columnName = BINARY_CHUNK,
            dataType = DataType.BYTE_ARRAY)
    private byte[] chunk=null;
}

我的问题在 byte[] chunk字段,因为每个 block 的大小为 1 mb 并且它们的数量几乎是无限的,所以当我读取 Header 时记录 OrmLite 将隐式读取 Collection<Binary>列表内容庞大 - 因此可能会导致内存耗尽。

我应该如何声明我的表来解决这个问题?

最佳答案

首先将您的集合声明为惰性集合并使用外部集合:

 @ForeignCollectionField(orderColumnName = Binary.BINARY_ORDER, orderAscending = true, eager=false)
 private ForeignCollection<Binary> binaries; //to be able to retrieve CloseableIterator 

如何迭代数据:延迟加载数据意味着保持连接以确保数据获取,因此 iterator.close();

    CloseableIterator<Binary> iterator = binaries.closeableIterator();
    try {
        while(iterator.hasNext()){
        Binary bin= iterator.next();
        //do stuff
        bin.setChunk(null) //discard if not needed any more
       }
    } finally {
        // must always close our iterators otherwise connections to the database are held open
        iterator.close();
    }

这只是一个提示,因为我不知道您将如何处理数据,但您的代码应该如下所示。

关于java - 如何解决 OrmLite 中巨大的 byte[] 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989961/

相关文章:

android - 窗口已经聚焦 - 忽略 com.android.internal.view 的聚焦增益

android - 如何将 Android 数据库与在线 SQL Server 同步?

python - pandas to_sql 方法给出日期列错误

java线程周期性地杀死一个进程

java - 如何为 java.util.List 的数组列表添加监听器

java - 列表数组中的 ArrayList

java - 如果 5<10>5<10 到 n,如何在 java 中检查

android - 来电屏幕上的 Activity 弹出窗口

android - Osmbonuspack : show name of Marker on the map

sqlite - SQLITE 数据库是否会在应用程序更新时重置?