Объекты, удаленные из ящика улья, по-прежнему загружаются в память
В моем приложении Flutter у меня есть коробка Hive с объектами Player. Просто для отладки я вывожу некоторые данные из моих объектов игрока в конструкторе, например:
Player({
@required String name,
@required this.id,
}) {
this.name = name.toUpperCase();
print('${this.toString()}');
}
@override
String toString() {
return 'id: $id, name: $name';
}
Игроки добавляются в поле следующим образом, где player.id - уникальный ключ:
playerBox.put(player.id, player);
При запуске приложения я также печатаю значения playerBox:
print (playerBox.values);
Что дает мне всех добавленных игроков. Все идет нормально. Но ... После удаления такого плеера:
playerBox.delete(playerId);
Он начинает вести себя немного странно. Когда я перезапускаю приложение, удаленного игрока больше нет в playerBox.values, поэтому он явно удален оттуда. Но конструкторы из всех удаленных объектов игрока по-прежнему работают.
Проверяя стек, я вижу, что эти объекты действительно созданы PlayerAdapter. Поэтому по какой-то причине удаленные объекты все еще считываются Hive с диска, но их нет в коробке.
** РЕДАКТИРОВАТЬ
Я также проверил файл player.hive на своем эмуляторе, и все удаленные модели фактически находятся в файле. Даже если они удалены и не будут возвращены с playerBox.values
Есть идеи, в чем может быть причина? Это ожидаемое поведение?
1 ответ
Отвечаю на это сам.
Есть идеи, в чем может быть причина? Это ожидаемое поведение?
Да и да. Думаю, мне следовало более внимательно проверить эти документы: Сжатие
Hive - это хранилище данных, предназначенное только для добавления. Когда вы изменяете или удаляете значение, изменение записывается в конец файла ящика. Рано или поздно ящик-файл занимает больше места на диске, чем должен. Hive может автоматически «сжать» вашу коробку в любой момент, чтобы закрыть «дыры» в файле.
Я решил это, сжав коробку после удаления следующим образом:
playerBox.compact();