{"id":15487423,"url":"https://github.com/rodydavis/sqlite_storage","last_synced_at":"2025-04-22T17:28:52.795Z","repository":{"id":223538010,"uuid":"760678362","full_name":"rodydavis/sqlite_storage","owner":"rodydavis","description":"Common storage interfaces for a SQLite database.","archived":false,"fork":false,"pushed_at":"2024-12-27T01:38:54.000Z","size":2117,"stargazers_count":9,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-18T17:30:46.306Z","etag":null,"topics":["analytics","dart","flutter","graph-database","key-value","logging","nosql","offline-first","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodydavis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-20T18:26:33.000Z","updated_at":"2025-02-01T19:01:21.000Z","dependencies_parsed_at":"2024-02-29T08:31:34.866Z","dependency_job_id":"d23c5eec-f408-48fe-adc9-6760861b5c68","html_url":"https://github.com/rodydavis/sqlite_storage","commit_stats":null,"previous_names":["rodydavis/sqlite_storage"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fsqlite_storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fsqlite_storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fsqlite_storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fsqlite_storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodydavis","download_url":"https://codeload.github.com/rodydavis/sqlite_storage/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250286879,"owners_count":21405518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","dart","flutter","graph-database","key-value","logging","nosql","offline-first","sqlite"],"created_at":"2024-10-02T06:40:23.464Z","updated_at":"2025-04-22T17:28:52.776Z","avatar_url":"https://github.com/rodydavis.png","language":"Dart","readme":"# sqlite_storage\n\nCommon storage interfaces for a SQLite database.\n\nUses [sqlite_async](https://pub.dev/packages/sqlite_async) for the underlying database.\n\n## Installing\n\nAdd the following to your `pubspec.yaml` file:\n\n```yaml\ndependencies:\n  sqlite_storage:\n    git:\n      url: git://github.com/rodydavis/sqlite_storage.git\n      ref: main\n```\n\n## Usage\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal db = Database(SqliteDatabase(path: 'app.db'));\nawait db.open();\n...\nawait db.close();\n```\n\n### Key/Value\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal kv = db.kv;\n\nawait kv.set('key', 'value');\nfinal value = await kv.get('key'); // 'value'\nawait kv.remove('key');\n\n// String\nawait kv.setString('key', 'value');\nfinal value = await kv.getString('key'); // String?\nfinal stream = kv.watchString('key'); // Stream\u003cString?\u003e\n\n// int\nawait kv.setInt('key', 1);\nfinal value = await kv.getInt('key'); // int?\nfinal stream = kv.watchInt('key'); // Stream\u003cint?\u003e\n\n// double\nawait kv.setDouble('key', 1.0);\nfinal value = await kv.getDouble('key'); // double?\nfinal stream = kv.watchDouble('key'); // Stream\u003cdouble?\u003e\n\n// num\nawait kv.setNum('key', 1);\nfinal value = await kv.getNum('key'); // num?\nfinal stream = kv.watchNum('key'); // Stream\u003cnum?\u003e\n\n// bool\nawait kv.setBool('key', true);\nfinal value = await kv.getBool('key'); // bool?\nfinal stream = kv.watchBool('key'); // Stream\u003cbool?\u003e\n\n// List\u003cString\u003e\nawait kv.setStringList('key', ['value']);\nfinal value = await kv.getStringList('key'); // List\u003cString\u003e?\nfinal stream = kv.watchStringList('key'); // Stream\u003cList\u003cString\u003e?\u003e\n\n// Bytes\nawait kv.setBytes('key', [1]);\nfinal value = await kv.getBytes('key'); // List\u003cint\u003e?\nfinal stream = kv.watchBytes('key'); // Stream\u003cList\u003cint\u003e?\u003e\n\n// JsonMap\nawait kv.setJsonMap('key', {'key': 'value'});\nfinal value = await kv.getJsonMap('key'); // Map\u003cString, dynamic\u003e?\nfinal stream = kv.watchJsonMap('key'); // Stream\u003cMap\u003cString, dynamic\u003e?\u003e\n\n// JsonList\nawait kv.setJsonList('key', ['value']);\nfinal value = await kv.getJsonList('key'); // List\u003cdynamic\u003e?\nfinal stream = kv.watchJsonList('key'); // Stream\u003cList\u003cdynamic\u003e?\u003e\n\n// Json\nawait kv.setJson('key', {'key': 'value'});\nfinal value = await kv.getJson('key'); // Object?\nfinal stream = kv.watchJson('key'); // Stream\u003cObject?\u003e\n```\n\n### Documents\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal docs = db.documents;\n\n// Document\nfinal doc = docs.doc('collection', 'id'); // Document\nawait doc.set({'key': 'value', 'list': [1, 2, 3]});\nawait doc.update({'key': 'value 2'}); // partial update\nfinal id = doc.id; // 'id'\nfinal value = await doc.get(); // Map\u003cString, dynamic\u003e?\nfinal stream = doc.watch(); // Stream\u003cMap\u003cString, dynamic\u003e?\u003e\nawait doc.remove();\n\n// Collection\nfinal collection = docs.collection('collection'); // Collection\nfinal doc = collection.doc('id'); // Document with id\nfinal doc = collection.doc(); // Document with new id\nfinal docs = await collection.select().get(); // List\u003cMap\u003cString, dynamic\u003e\u003e\nfinal stream = collection.select().watch(); // Stream\u003cList\u003cMap\u003cString, dynamic\u003e\u003e\u003e\n\n// Chain\nfinal doc = docs.collection('collection').doc('id-1').collection('sub-collection').doc('id-2');\n```\n\n### Files\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal files = db.files;\n\n// String\nfinal value = await files.readAsString('path'); // String?\nawait files.writeAsString('path', 'value');\nfinal stream = files.watchString('path'); // Stream\u003cString?\u003e\n\n// Bytes\nfinal value = await files.readAsBytes('path'); // List\u003cint\u003e?\nawait files.writeAsBytes('path', [1]);\nfinal stream = files.watchBytes('path'); // Stream\u003cList\u003cint\u003e?\u003e\n\n// Metadata\nfinal info = await files.metadata('path'); // (DateTime, DateTime)?\nfinal exists = await files.exists('path'); // bool\n\n// Delete\nawait files.delete('path');\n\n// Delete all\nawait files.clear();\n```\n\n### Requests\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\nimport 'package:http/http.dart' as http;\n\nfinal Database db = ...;\nfinal requests = db.requests;\n\nfinal innerClient = http.Client();\ndb.innerClient = innerClient;\n\n// GET\nfinal response = await requests.get(Uri.parse('https://example.com')); // Stream\u003chttp.Response\u003e\nawait for (final res in response) {\n  print((res.statusCode, res.body));\n}\n\n// Repeated requests with Cache-Control header are cached\nfinal response = await requests.get(Uri.parse('https://example.com'), headers: {'Cache-Control': 'max-age=60'}); // Stream\u003chttp.Response\u003e\nawait for (final res in response) {\n  print((res.statusCode, res.body));\n}\n```\n\n### Graph\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal graph = db.graph;\n\n// Node (must have id)\nfinal node = graph.insertNode({'id': '1', 'name': 'Node 1'}); // Node\nfinal nodes = await graph.selectNodes().get();\nfinal stream = graph.selectNodes().watch();\nawait graph.removeNode(node.id);\n\n// Edges\nfinal nodeA = graph.insertNode({'id': 'A', 'name': 'Node A'});\nfinal nodeB = graph.insertNode({'id': 'B', 'name': 'Node B'});\nfinal edge = graph.insertEdge(nodeA.id, nodeB.id, {'name': 'Edge AB'}); // Edge\nfinal edges = await graph.selectEdges().get();\nfinal stream = graph.selectEdges().watch();\nawait graph.removeEdge(nodeA.id, nodeB.id);\n\n// Edges inbound\nfinal edges = await graph.selectEdgesInbound(node.id).get();\n\n// Edges outbound\nfinal edges = await graph.selectEdgesOutbound(node.id).get();\n\n// Select edges\nfinal edges = await graph.selectSearchEdges(nodeA.id, nodeB.id).get();\n\n// Node by id\nfinal node = await graph.selectNodeById(node.id).get();\n\n// Traverse inbound\nfinal ids = await graph.selectTraverseInbound(node.id).get();\n\n// Traverse outbound\nfinal ids = await graph.selectTraverseOutbound(node.id).get();\n\n// Traverse bodies inbound\nfinal nodes = await graph.selectTraverseBodiesInbound(node.id).get();\n\n// Traverse bodies outbound\nfinal nodes = await graph.selectTraverseBodiesOutbound(node.id).get();\n\n// Traverse bodies\nfinal nodes = await graph.selectTraverseBodies(node.id).get();\n\n// Traverse\nfinal nodes = await graph.selectTraverse(node.id).get();\n```\n\n### Logging\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal log = db.logging;\n\nawait log.log('message', level: 1);\nfinal logs = await log.select().get();\n```\n\n### Analytics\n\n```dart\nimport 'package:sqlite_storage/sqlite_storage.dart';\nimport 'package:sqlite_async/sqlite_async.dart';\n\nfinal Database db = ...;\nfinal analytics = db.analytics;\n\nawait analytics.sendEvent('event', 'test');\nfinal events = await analytics.select().get();\n```\n\n## Contributing\n\n### Testing\n\n```sh\ndart test --concurrency=1\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fsqlite_storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodydavis%2Fsqlite_storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fsqlite_storage/lists"}