
Show HN: Fast database for React Native with multiple data-type support - ammarahm-ed
https://github.com/ammarahm-ed/react-native-mmkv-storage
======
tomovo
In the iOS implementation, a new dispatch queue is created on each 'set' or
'get' call, from which it switches to the main queue to call MMKV, wrapped in
a try/catch block.

Inside the MMKV library, a NSData object is created, another class is used to
write a single "int" value to it, then the data object is used as the "raw"
value for the given key.

I haven't looked any futher but already this seems like a lot of work to set a
number in memory. Is there any reason for this?

~~~
ammarahmed6506
I think you are right. I was focusing on basic implementation. Now I will make
the performance optimizations needed. For example using a single instance of
created class for all get set methods and not create them on every call.
Thanks for pointing it out.

The second thing about numbers is that its just in case you needed it for
something, it is there but there are other ways to set the data too.

~~~
esprehn
Why use a dispatch queue at all? You don't use an Executor on Android. Example
usage of MMKV doesn't seem to show putting it in queues.

~~~
ammarahmed6506
Basically I forked this code from another repo and worked over it so the
initial work is theirs. I will look into optimizing this as soon as possible.
What do you think? Should callbacks be used instead of Promise?

------
sercand
We are using SQLite on React Native with the JSI without writing a java or
object C bridge. As a result, all operations are much faster and almost all of
them don't need to Promise callback. I don't see any reason to use this over
SQLite. We can do same thing on SQLite much faster way.

~~~
vivekseth
The primary use of MMKV seems to be a replacement for NSUserDefaults. I agree
the SQLite is probably the best solution overall, but this could be a faster
alternative to anyone just using NSUserDefaults

------
c-smile
Just for the note:

Sciter implements what I call "an ultimate data persistence solution" \- NoSQL
DB integrated right into script VM.

You can open storage as:

    
    
        var storage = Storage.open("path/to/data/file.db"); 
    

Storage provides root object - normal script object (or array) that can be
updated by normal script means:

    
    
        storage.root = { foo:[1,2,3], bar: {...} };
        storage.root.foo.push(4); 
        storage.root.bar.newProp = 42; 
    

All script objects that are accessible from the storage.root are persist-able
- pushed to HD on storage.close() or storage.commit();

More details about architecture and implementation: [https://sciter.com/data-
persistence-in-sciter-database-integ...](https://sciter.com/data-persistence-
in-sciter-database-integrated-with-the-language/)

Overall feature set is close to MongoDB (modulo sharding).

DB layer uses Konstantin Knizhnik's DyBASE pretty much as it is:
[http://www.garret.ru/dybase.html](http://www.garret.ru/dybase.html)

------
throw03172019
What is the benefit over async storage? We’ve built a few RN apps and never
felt it was too slow to work with.

------
laex
How does react-native-mmkv-storage store data under-the-hood?

When I was building SwiftStore - a KV store [1] for iOS, I went with LevelDB
as the choice for the underlying database.

LevelDB because it's written in c++ and used widely as an embedded database.
Integrating it as a static library in Objective-C is also fairly straight
forward.

[1]
[https://github.com/hemantasapkota/SwiftStore](https://github.com/hemantasapkota/SwiftStore)

~~~
ammarahm-ed
MMKV uses mmap to keep memory synced with file, and protobuf to encode/decode
values, making the most of iOS/macOS to achieve best performance and uses c++

------
jiofih
Why use this over SQLite?

~~~
ammarahmed6506
Its simple and easy to use if you dont have a very complex data structure.

------
jitl
I’m surprised to not find any iteration or query primitives. No key scanning?

~~~
ammarahmed6506
MMKV is a simple key-value store but the good thing is that it is fast, A
custom indexer can be made for querying. However there is a method to get all
the keys in the storage but its not exposed in react native side. Is that what
you mean?

~~~
mpweiher
I couldn’t find any numbers or benchmarks in the repo. What did I miss?

~~~
ammarahmed6506
Go to github.com/Tencent/MMKV to see benchmarks for iOS and android

------
theyoungwolf
can someone tell me what this is used for? Is this like a replacement for
localstorage?

~~~
ammarahmed6506
Yes its a replacment, a very fast one with all datatypes support, not only
strings.

~~~
laex
Is it possible to use it at the native layer (objective-c / java )? My use
case is for storing/reading info before react-native JS is bootstrapped. I've
tried using AsyncStorage for that but the bindings for objective-c isn't
straightforward at all!

~~~
ammarahmed6506
MMKV is pretty straight forward, you can use it very easily on obj c or java
only. Check the native code on the repo.

