Sometimes your models are connected with each other. The following person class has a list of other persons called "friends". There could also be a list of other objects like "pets".
class Person extends HiveObject {
String name;
int age;
List<Person> friends;
Person(this.name, this.age);
}
You could just use a regular list to store the persons, but updating a person would be rather complicated because the person objects would be stored redundantly.
HiveLists provide an easy way to solve the problem above. They allow you to store a "link" to the actual object.
import 'package:hive/hive.dart';
void main() async {
Hive.registerAdapter(PersonAdapter());
var persons = await Hive.openBox<Person>('personsWithLists');
persons.clear();
var mario = Person('Mario');
var luna = Person('Luna');
var alex = Person('Alex');
persons.addAll([mario, luna, alex]);
mario.friends = HiveList(persons); // Create a HiveList
mario.friends.addAll([luna, alex]); // Update Mario's friends
mario.save(); // make persistent the change,
print(mario.friends);
luna.delete(); // Remove Luna from Hive
print(mario.friends); // HiveList updates automatically
}
@HiveType()
class Person extends HiveObject {
@HiveField(0)
String name;
@HiveField(1)
HiveList friends;
Person(this.name);
String toString() => name; // For print()
}
class PersonAdapter extends TypeAdapter<Person> {
@override
final typeId = 0;
@override
Person read(BinaryReader reader) {
return Person(reader.read())..friends = reader.read();
}
@override
void write(BinaryWriter writer, Person obj) {
writer.write(obj.name);
writer.write(obj.friends);
}
}
First, we store the three persons, Mario, Luna, and Alex in the persons
box. HiveLists can only be used with objects which are currently in a box.
Next, we create a HiveList
which contains Mario's friends. The HiveList
constructor needs the HiveObject
, which will contain the list. The list must not be moved to another HiveObject
. The second parameter is the box, which contains the items of the list.
When you delete an object from a box, it is also deleted from all HiveLists
. If you delete an object from a HiveList
, it still remains in the box.