首页 > 解决方案 > Room 中的对象大小限制

问题描述

这是关于 Room 持久性库如何在 Android 中运行的一般问题。我遇到了 Room 的一个可能的错误/功能,如果我尝试将包含太多数据的 POJO 插入到 Room 对象 DAO 中,然后稍后通过 id 或特定字段查询该对象,则会得到空结果。

在这种情况下,Room 绝对没有提供任何失败/错误日志,我花了一段时间才发现,如果我将大对象分成两个数据一半的对象,那么我以后就可以查询这两个对象(我注意到正确查询了我的 Db 中具有 3500 个字符串子对象的另一个 POJO,但上述超大对象具有 6500 个字符串子对象)。

具体来说,以下是有问题的对象的结构,为简单起见,我排除了 getter/setter:

@Entity(tableName = KanjiComponent.TABLE_NAME)
public class KanjiComponent {

    public KanjiComponent() {}

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(index = true, name = COLUMN_ID)
    public long id;

    @ColumnInfo(name = COLUMN_COMPONENT_STRUCTURE)
    private String structure;

    @TypeConverters({MyAppDbTypeConverters.class})
    private List<KanjiComponent.AssociatedComponent> associatedComponents;

    public static class AssociatedComponent {
        private String component;
        private String associatedComponents;
    }
}

KanjiComponent.AssociatedComponent 中的“组件”字段是一个单字符的字符串,但 KanjiComponent.AssociatedComponent 中的“关联组件”字段可以是从短字符串到非常长的“;”字符串。分隔字符。

KanjiComponent.AssociatedComponent 的列表在我的有问题的对象中的大小为 6500,而列表大小高达 3500 左右的对象没有遇到任何问题。因此,我创建了两个 KanjiComponent.AssociatedComponent 列表大小分别为 3000 和 3500 的对象,现在一切正常。

我所有的插入/请求都是在后台线程上完成的,并且请求完整的数据库List<KanjiComponent> list = myDatabase.getInstance().getAllKanjiComponents()

在同一应用程序和同一后台线程中请求其他对象数据库可以正常工作。查询完整的上述数据库产生的大小为 0,但可以完全请求另一个具有 85000 个小型对象的 POJO 数据库,列表大小为 85000。因此,Room 本身没有问题。

我猜测在 Android 或 Room 中 POJO 存在固有的对象大小限制,但我无法找到这方面的信息。我也不确定如何测量我的大型 POJO 的大小以找到有问题的大小阈值的值。

有没有人遇到过这个问题?除了在将超大对象插入房间之前手动拆分超大对象之外,还有更好的方法来解决它吗?Room/Android 中的对象大小和/或子对象计数限制是什么?

谢谢

标签: androiddatabaseobjectnullsize

解决方案


我猜在 Android 或 Room 中 POJO 存在固有的对象大小限制,但我无法找到这方面的信息

结果集超过 1MB 的任何查询都容易出现问题。虽然原则上它应该起作用,但实际上我的目标是避免它。

KanjiComponent.AssociatedComponent 列表在我有问题的对象中大小为 6500

所以,要清楚:

  • 您有 6,500 多个对象的列表
  • 这些对象中的每一个都可以有一个字符串“很长的字符串”;“分隔字符”
  • 您正在使用 aTypeConverters将所有这些内容塞进一列

如果是这样,我预计这是非常不可靠的,因为OutOfMemoryErrors.

除了在将超大对象插入房间之前手动拆分超大对象之外,还有更好的方法来解决它吗?

更改数据库设计以避免出现大量列。有两个具有相应 Room 实体的表。获得自己的表/实体,在和AssociatedComponent之间具有 1:N 关系。考虑使用分页库仅根据需要将子集加载到内存中(例如,用于滚动列表)。KanjiComponentAssociatedComponent


推荐阅读