Kvsql
A type safe key/value store for Flutter backed by Sqlite. Powered by Sqlcool.
Usage
Initialize
import 'package:kvsql/kvsql.dart';
store = KvStore();
await store.onReady;
Initialize with an existing Sqlcool database:
import 'package:kvsql/kvsql.dart';
import 'package:sqlcool/sqlcool.dart';
final db = Db();
await db.init(path: "mydb.db", schema=[kvSchema()]);
store = KvStore(db: db);
Insert or update
await store.put<String>("mykey", "myvalue");
Supported value types are: String
, int
, double
, bool
, List<T>
, Map<K, V>
Allowed types for map keys are: String
, int
and double
Allowed types for lists and maps values are String
, int
, bool
, double
and dynamic
Delete
await store.delete("mykey");
Select
Returns a typed value
final List<int> myValue = await store.select<List<int>>("mykey");
Select sync
Synchronously select a value.
final Map<String, int> myValue = store.selectSync<Map<String, int>>("mykey");
For this to work you need to initialize the store with the inMemory
option that keeps an in memory copy of the store values.
store = KvStore(inMemory = true);
Push
This method upserts a key/value using a queue: it can be safely called concurrently. Useful for high throughput updates.
store.push("mykey", "my_value");
Limitations:
- This method is executed asynchronously but can not be awaited
- It does not control the type of the data
Note: if you don't await your mutations or use push
you are exposed to
eventual consistency
Check the examples for detailled usage.
Persistant state
The kvstore can be used to persist the app state. Example with provider:
import 'package:flutter/foundation.dart';
import 'package:kvsql/kvsql.dart';
final stateStore =
KvStore(inMemory: true, path: "stateStore.db");
class AppState with ChangeNotifier {
int get value => stateStore.selectSync<int>("value");
set value(int v) => stateStore.put<int>("value", v);
void updateValue(int val) {
value = val;
notifyListeners();
}
}