Ограничения размера объекта в комнате - PullRequest
0 голосов
/ 30 сентября 2018

Это общий вопрос о том, как библиотека постоянных номеров работает в Android.Я столкнулся с возможной ошибкой / особенностью Room, когда я пытался вставить POJO со слишком большим количеством данных в DAO объекта Room, а затем запросить объект позже, либо по id, либо по определенному полю, даст нулевой результат.

В данном случае абсолютно нет журналов ошибок / ошибок, и мне потребовалось некоторое время, чтобы выяснить, что если я разделю большой объект на два объекта с половиной данных, то я смог запросить оба объектапозже (я заметил, что другой POJO в моем Db с подобъектами 3500 String был запрошен правильно, но у вышеупомянутого объекта большего размера есть 6500 подобъектов String).

Если быть точным, ниже приведена структура проблемного объекта, гдедля простоты я исключил геттеры / сеттеры:

@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 является односимвольной строкой, но поле «relatedComponents» в KanjiComponent.AssociatedComponent может быть любым из короткихСтрока с очень длинной строкой ";"Символы с разделителями.

Список KanjiComponent.AssociatedComponent имеет размер 6500 в моем проблемном объекте, и объекты с размером списка до 3500 не встретили никаких проблем.Поэтому я создал два объекта с размерами списка KanjiComponent.AssociatedComponent 3000 и 3500, и теперь все работает нормально.

Все мои вставки / запросы выполняются в фоновых потоках, а также запрашивается полная база данных (List<KanjiComponent> list = myDatabase.getInstance().getAllKanjiComponents())дает результат с размером 0, хотя в базе данных теперь есть 19 допустимых объектов KanjiComponent (т. е. до 3500 подобъектов каждый).

Запрос других баз данных объектов в том же приложении и в том же фоновом потоке работаетхорошо.Запросы для полной вышеупомянутой базы данных дают размер 0, но можно полностью запросить другую базу данных POJO с 85000 объектами малого размера, что дает размер списка 85000. Таким образом, с самой комнатой нет проблем.

IЯ предполагаю, что для POJO существуют ограничения по размеру объектов как в Android, так и в Room, но я не смог найти информацию об этом.Я также не уверен, как измерить размер моих больших POJO, чтобы найти значение этого проблемного порога размера.

Кто-нибудь сталкивался с этой проблемой?Есть ли лучший способ решить эту проблему, кроме ручного разбиения негабаритных объектов перед вставкой их в Room?Каковы ограничения по размеру объекта и / или количеству подобъектов в Room / Android?

Спасибо

1 Ответ

0 голосов
/ 30 сентября 2018

Я предполагаю, что для POJO существуют ограничения по размеру объектов в Android или в Room, но я не смог найти информацию по этому

Любому запросу, чьенабор результатов более 1 МБ будет подвержен проблемам.Хотя в принципе это должно работать, на практике я стремлюсь избегать этого.

Список KanjiComponent.AssociatedComponent имеет размер 6500 в моем проблемном объекте

Итак, чтобы быть ясным:

  • У вас есть список из 6 500+ объектов
  • Каждый из этих объектов может иметь строку "очень длинная строка"; "символы с разделителями"
  • Вы используете TypeConverters, чтобы втиснуть все это в один столбец

Если это так, я ожидаю, что это будет очень ненадежно из-за OutOfMemoryErrors.

Есть ли лучший способ решить эту проблему, кроме ручного разбиения негабаритных объектов перед их вставкой в ​​Room?

Измените структуру базы данных, чтобы избежать создания массивного столбца.Есть две таблицы с соответствующими сущностями комнаты.AssociatedComponent получает свою собственную таблицу / сущность с отношением 1: N между KanjiComponent и AssociatedComponent.Попробуйте использовать библиотеку подкачки для загрузки только подмножеств в память по мере необходимости (например, для прокрутки списков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...