Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question] How to manipulate a list of objects ? #6

Closed
aswinmohanme opened this issue Jul 30, 2019 · 5 comments
Closed

[Question] How to manipulate a list of objects ? #6

aswinmohanme opened this issue Jul 30, 2019 · 5 comments

Comments

@aswinmohanme
Copy link

Hey, first of all hive is a pretty sweet library and the need to not pass down boxes simplifies development by a ton. I am using it for an App in production, but I ran into a problem. It's more like a performance issue though.

I have a list of objects, rather than using the type adapter I'm storing it as a list of maps and it seems to work pretty well. But what if I want to append to the stored list. Will the entire list be rewritten into the box. Wouldn't it cause any performance issues down the line? Is there any better way to do this ?

@simc
Copy link
Member

simc commented Jul 30, 2019

Hi,
Thanks for using the library but I cannot recommend using it in production just yet.

Currently, every time a list / map / object is changed, it has to be written completely.
Now the question is how often you change the list and how big is it? If you change it 10 times per second or it is really big, this might be a problem. Otherwise you won't notice a performance hit.

Currently there are no better ways to do it and I haven't found a smart way to handle this internally. If only a part of your list changes regulary you should consider splitting the list in two parts. If you have an idea how we could store "parts of lists" in the box file, just let me know ;)

@simc
Copy link
Member

simc commented Aug 17, 2019

I just published a new version of Hive which solves your problem. You can use Hive.add() and Hive.values to use a box as a list. Docs

@simc simc closed this as completed Aug 17, 2019
@adriancmurray
Copy link

adriancmurray commented Sep 18, 2019

@leisim when using Box.values do you think using the map method

Box.values.map((m)=>SomeObject.fromJson(m)).toList()

for object generation is efficient enough instead of opting into the typeannotator? The only way I've side skirted the cast error of "_InternalHashMap<dynamic, dynamic> is not a subtype of Map<String, dynamic>" is by forcing a json encode/decode and then using my SomeObject.fromJson(map) method to generate the object. I don't think this is a good solution but wanted to get your input before I committed the time to go through and annotate each object and its items.

@adriancmurray
Copy link

[Update] - k, thanks to this response : flutter/flutter#16589 (comment)
I was able to dump the typecast errors and using the map method works as it should without forcing json encode/decode. Considering your .values and .toMap methods work similarly, I don't think I need any input on the efficiency of this. Thanks.

@simc
Copy link
Member

simc commented Sep 18, 2019

@adriancmurray
I understand that you store multiple maps in a box and want to cast them from dynamic. There are two methods I recommend.

Say you want maps of type Map<String, String>:

  1. Use the cast() method on your map:
box.values.map((m) => m.cast<String, String>()).toList();
  1. Store your data in another object and let Hive do the work:
@HiveType
class MapHolder {
  @HiveField(0)
  Map<String, String> data;
}

Run the type adapter generator and get maps like this:

var myMap = box.get('myMap').data;

Neither solution is perfect but unfortunately Dart is a bit lacking when it comes to use of Generics at runtime. If anyone finds out how this could be improved, I'd be happy to implement it.

@cengbm cengbm mentioned this issue Feb 9, 2021
Closed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants