sqlite3 3.0.0-beta.1
sqlite3: ^3.0.0-beta.1 copied to clipboard
Provides lightweight yet convenient bindings to SQLite by using dart:ffi
sqlite3 #
Provides Dart bindings to SQLite via dart:ffi.
Using this library #
Because this library uses hooks, it bundles SQLite with your application and doesn't require any external dependencies or build configuration. To use it, depend on it:
dart pub add sqlite3
For native platforms, the basic sketch for using this library is to:
- Import
package:sqlite3/sqlite3.dart. - Use
sqlite3.open()to open a database file, orsqlite3.openInMemory()to open a temporary in-memory database. - Use
Database.executeorDatabase.prepareto execute statements directly or by preparing them first. - Don't forget to close prepared statements or the database with
dispose()once you no longer need them.
For a more complete example on how to use this library, see the example.
Supported platforms #
This library provides prebuilt versions of SQLite for the following platforms:
- Android:
armv7a,aarch64,x86,x64. - iOS:
arm64(devices),arm64(simulator),x64(simulator). - macOS:
arm64,x64. - Linux:
armv7,aarch64,x64,x86,riscv64gc. - Windows:
aarch64,x64,x86.
For more information, see hook options.
In addition to native platforms, this package supports running on the web by accessing a sqlite3
build compiled to WebAssembly.
Web support is only officially supported for dartdevc and dart2js. Support
for dart2wasm is experimental and incomplete.
For more information, see web support below.
On all supported platforms, you can also use SQLite3MultipleCiphers instead of SQLite to encrypt databases. The hook options page describe this setup.
Supported datatypes #
When binding parameters to queries, the supported types are ìnt,
double, String, List<int> (for BLOB) and null.
Result sets will use the same set of types.
On the web (but only on the web), BigInt is supported as well.
WASM (web support) #
This package experimentally supports being used on the web with a bit of setup. The web version binds to a custom version of sqlite3 compiled to WebAssembly without Emscripten or any JavaScript glue code.
Please note that stable web support for package:sqlite3 is restricted to Dart
being compiled to JavaScript. Support for dart2wasm is experimental. The API
is identical, but the implementation is severely limited.
Setup #
To use this package on the web, you need:
- The sqlite3 library compiled as a WebAssembly module, available from the
GitHub releases of this package.
Note that, for this package, sqlite3 has to be compiled in a special way.
Existing WebAssembly files from e.g. sql.js will not work with
package:sqlite3/wasm.dart. - A file system implementation, since websites can't by default access the host's file system.
This package provides
InMemoryFileSystemand anIndexedDbFileSystemimplementation.
After putting sqlite3.wasm under the web/ directory of your project, you can
open and use sqlite3 like this:
import 'package:http/http.dart' as http;
import 'package:sqlite3/common.dart';
import 'package:sqlite3/wasm.dart';
Future<WasmSqlite3> loadSqlite() async {
final sqlite = await WasmSqlite3.loadFromUrl(Uri.parse('sqlite3.wasm'));
final fileSystem = await IndexedDbFileSystem.open(dbName: 'my_app');
sqlite.registerVirtualFileSystem(fileSystem, makeDefault: true);
return sqlite;
}
The returned WasmSqlite3 has an interface compatible to that of the standard sqlite3 field
in package:sqlite3/sqlite3.dart, databases can be opened in similar ways.
An example for such web folder is in example/web/ of this repo.
To view the example, copy a compiled sqlite3.wasm file to web/sqlite3.wasm in this directory.
Then, run dart run build_runner serve example:8080 and visit http://localhost:8080/web/ in a browser.
Another ../examples/multiplatform/ uses common interface to sqlite3 on web and native platforms.
To run this example, merge its files into a Flutter app.
Sharing code between web and a Dart VM #
The package:sqlite3/common.dart library defines common interfaces that are implemented by both
the FFI-based native version in package:sqlite3/sqlite3.dart and the experimental WASM
version in package:sqlite3/wasm.dart.
By having shared code depend on the common interfaces, it can be used for both native and web
apps.
Web encryption #
Starting from version 2.6.0, package:sqlite3/wasm.dart supports loading a compiled version of
SQLite Multiple Ciphers providing encryption
support for the web.
Please note that this variant is not currently tested as well as the regular SQLite version.
For this reason, using SQLite Multiple Ciphers with package:sqlite3/wasm.dart should be considered
experimental for the time being.
To test the encryption integration, download sqlite3mc.wasm from the releases
of this package and use that as a URL to load sqlite3 on the web:
final sqlite3 = await WasmSqlite3.loadFromUrl(Uri.parse('sqlite3mc.wasm'));
sqlite3.registerVirtualFileSystem(InMemoryFileSystem(), makeDefault: true);
final database = sqlite3.open('/database')
..execute("pragma key = 'test';"); // TODO: Replace key
Testing #
To run the tests of this package with wasm, either download the sqlite3.wasm file from the
GitHub releases to example/web or compile it yourself (see build setup).
To run tests on the Dart VM, Firefox and Chrome, use:
dart test -P full