sqflite
2.4.5Flutter plugin for SQLite, a self-contained, high-reliability, embedded, SQL database engine.
Readme
sqflite
SQLite plugin for Flutter. Supports iOS, Android and MacOS.
- Support transactions and batches
- Automatic version managment during open
- Helpers for insert/query/update/delete queries
- DB operation executed in a background thread on iOS and Android
Other platforms support:
- Linux/Windows/DartVM support using sqflite_common_ffi
- Experimental Web support using sqflite_common_ffi_web.
Usage example:
- notepad_sqflite: Simple flutter notepad working on iOS/Android/Windows/linux/Mac
Getting Started
To get started, you need to add sqflite to your project. Follow the steps below:
-
Open the terminal in your project root. You can do this by pressing
Alt+F12in Android Studio orCtrl+`in VS Code. -
Run the following command:
flutter pub add sqflite
This command will add a line to your package's pubspec.yaml file and run an implicit flutter pub get. The added line will look like this:
dependencies:
sqflite:
Usage example
Import sqflite.dart
import 'package:sqflite/sqflite.dart';
Opening a database
A SQLite database is a file in the file system identified by a path. If relative, this path is relative to the path
obtained by getDatabasesPath(), which is the default database directory on Android and the documents directory on iOS/MacOS.
var db = await openDatabase('my_db.db');
There is a basic migration mechanism to handle schema changes during opening.
Many applications use one database and would never need to close it (it will be closed when the application is terminated). If you want to release resources, you can close the database.
await db.close();
Raw SQL queries
Demo code to perform Raw SQL queries
// Get a location using getDatabasesPath
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
// Delete the database
await deleteDatabase(path);
// open the database
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
// When creating the db, create the table
await db.execute(
'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});
// Insert some records in a transaction
await database.transaction((txn) async {
int id1 = await txn.rawInsert(
'INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');
print('inserted1: $id1');
int id2 = await txn.rawInsert(
'INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',
['another name', 12345678, 3.1416]);
print('inserted2: $id2');
});
// Update some record
int count = await database.rawUpdate(
'UPDATE Test SET name = ?, value = ? WHERE name = ?',
['updated name', '9876', 'some name']);
print('updated: $count');
// Get the records
List<Map> list = await database.rawQuery('SELECT * FROM Test');
List<Map> expectedList = [
{'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789},
{'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416}
];
print(list);
print(expectedList);
assert(const DeepCollectionEquality().equals(list, expectedList));
// Count the records
count = Sqflite
.firstIntValue(await database.rawQuery('SELECT COUNT(*) FROM Test'));
assert(count == 2);
// Delete a record
count = await database
.rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);
assert(count == 1);
// Close the database
await database.close();
Basic information on SQL here.
SQL helpers
Example using the helpers
final String tableTodo = 'todo';
final String columnId = '_id';
final String columnTitle = 'title';
final String columnDone = 'done';
class Todo {
int id;
String title;
bool done;
Map<String, Object?> toMap() {
var map = <String, Object?>{
columnTitle: title,
columnDone: done == true ? 1 : 0
};
if (id != null) {
map[columnId] = id;
}
return map;
}
Todo();
Todo.fromMap(Map<String, Object?> map) {
id = map[columnId];
title = map[columnTitle];
done = map[columnDone] == 1;
}
}
class TodoProvider {
Database db;
Future open(String path) async {
db = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute('''
create table $tableTodo (
$columnId integer primary key autoincrement,
$columnTitle text not null,
$columnDone integer not null)
''');
});
}
Future<Todo> insert(Todo todo) async {
todo.id = await db.insert(tableTodo, todo.toMap());
return todo;
}
Future<Todo> getTodo(int id) async {
List<Map> maps = await db.query(tableTodo,
columns: [columnId, columnDone, columnTitle],
where: '$columnId = ?',
whereArgs: [id]);
if (maps.length > 0) {
return Todo.fromMap(maps.first);
}
return null;
}
Future<int> delete(int id) async {
return await db.delete(tableTodo, where: '$columnId = ?', whereArgs: [id]);
}
Future<int> update(Todo todo) async {
return await db.update(tableTodo, todo.toMap(),
where: '$columnId = ?', whereArgs: [todo.id]);
}
Future close() async => db.close();
}
Read results
Assuming the following read results:
List<Map<String, Object?>> records = await db.query('my_table');
Resulting map items are read-only
// get the first record
Map<String, Object?> mapRead = records.first;
// Update it in memory...this will throw an exception
mapRead['my_column'] = 1;
// Crash... `mapRead` is read-only
You need to create a new map if you want to modify it in memory:
// get the first record
Map<String, Object?> map = Map<String, Object?>.from(mapRead);
// Update it in memory now
map['my_column'] = 1;
Transaction
Don't use the database but only use the Transaction object in a transaction
to access the database. Keep in mind that the callbacks onCreate onUpgrade onDowngrade are already internally wrapped in a transaction, so there is no need to wrap your statements in a transaction within those callbacks.
await database.transaction((txn) async {
// Ok
await txn.execute('CREATE TABLE Test1 (id INTEGER PRIMARY KEY)');
// DON'T use the database object in a transaction
// this will deadlock!
await database.execute('CREATE TABLE Test2 (id INTEGER PRIMARY KEY)');
});
A transaction is committed if the callback does not throw an error. If an error is thrown, the transaction is cancelled and the same error is re-thrown. So to rollback a transaction one way is to throw an exception.
try {
await database.transaction((txn) async {
await txn.update('TABLE', {'foo': 'bar'});
});
// No error, the transaction is committed
} catch (e, st) {
// this reliably catch if there is a key conflict
// We know that the transaction is rolled back.
}
try {
await database.transaction((txn) async {
// ...
// cancel the transaction (any error will do)
throw StateError('cancel transaction');
});
} catch (e, st) {
// We know that the transaction is rolled back.
}
You can however catch the exception inside the transaction and not rethrow it to commit the transaction. Only the failed statement will not be executed.
await database.transaction((txn) async {
// ...
try {
await txn.update('TABLE', {'foo': 'bar'});
} catch (e, st) {
// this reliably catch if there is a key conflict
// We know that the transaction is rolled back.
}
// ...
// The transaction will be committed
});
Batch support
To avoid ping-pong between dart and native code, you can use Batch:
batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();
Getting the result for each operation has a cost (id for insertion and number of changes for update and delete), especially on Android where an extra SQL request is executed. If you don't care about the result and worry about performance in big batches, you can use
await batch.commit(noResult: true);
Warning, during a transaction, the batch won't be committed until the transaction is committed
await database.transaction((txn) async {
var batch = txn.batch();
// ...
// commit but the actual commit will happen when the transaction is committed
// however the data is available in this transaction
await batch.commit();
// ...
});
By default a batch stops as soon as it encounters an error (which typically reverts the uncommitted changes). You can ignore errors so that every successfull operation is ran and committed even if one operation fails:
await batch.commit(continueOnError: true);
Table and column names
In general it is better to avoid using SQLite keywords for entity names. If any of the following name is used:
"add","all","alter","and","as","autoincrement","between","case","check","collate","commit","constraint","create","default","deferrable","delete","distinct","drop","else","escape","except","exists","foreign","from","group","having","if","in","index","insert","intersect","into","is","isnull","join","limit","not","notnull","null","on","or","order","primary","references","select","set","table","then","to","transaction","union","unique","update","using","values","when","where"
the helper will escape the name i.e.
db.query('table')
will be equivalent to manually adding double-quote around the table name (confusingly here named table)
db.rawQuery('SELECT * FROM "table"');
However in any other raw statement (including orderBy, where, groupBy), make sure to escape the name
properly using double quote. For example see below where the column name group is not escaped in the columns
argument, but is escaped in the where argument.
db.query('table', columns: ['group'], where: '"group" = ?', whereArgs: ['my_group']);
Supported SQLite types
No validity check is done on values yet so please avoid non supported types https://www.sqlite.org/datatype3.html
DateTime is not a supported SQLite type. Personally I store them as
int (millisSinceEpoch) or string (iso8601)
bool is not a supported SQLite type. Use INTEGER and 0 and 1 values.
More information on supported types here.
INTEGER
- Dart type:
int - Supported values: from -2^63 to 2^63 - 1
REAL
- Dart type:
num
TEXT
- Dart type:
String
BLOB
- Dart type:
Uint8List
Current issues
- Due to the way transaction works in SQLite (threads), concurrent read and write transaction are not supported. All calls are currently synchronized and transactions block are exclusive. I thought that a basic way to support concurrent access is to open a database multiple times but it only works on iOS as Android reuses the same database object. I also thought a native thread could be a potential future solution however on android accessing the database in another thread is blocked while in a transaction...
More
- How to guide
- Notes about Desktop support
- Notes about Encryption support
- Notes about Web support
- Notes about SQLite versions as some features may not be available depending on the SQLite version.
Changelog
2.4.5
- Mark the transaction closed when SQLite rolled it back by itself on Android
(
ConflictAlgorithm.rollback,RAISE(ROLLBACK)...), requires sqflite_android 2.4.5 for the fix
2.4.4+2
- Remove
flutter/materialimport, adapt example tomaterial_ui
2.4.4
- Add
sqflite-crud-and-transactions,sqflite-open-databaseandsqflite-testing-and-platformsagent skills inskills/, installable withdart run skills@ get
2.4.3
- Requires dart 3.12
2.4.2+1
- Requires dart 3.10
2.4.2
- Requires dart 3.7
2.4.1
- Add darwin extension to allow creating unprotected folder in iOS (issue #924)
2.4.0
- Make
sqflitea federated plugin includingsqflite_androidandsqflite_darwin(iOS/macOS) plugins
2.3.3+2
- Remove android v1 embedding support
- Use
compileSdk 34on Android sdk: >= 3.3.0
2.3.2
- Shared iOS/MacOS darwin implementation
- Remove FMDB podspec dependency
2.3.1
- Add iOS/MacOS privacy manifest
2.3.0
- Dart 3 only
2.2.8+4
- Android: Adds a namespace for compatibility with AGP 8.0.
- Android: Use compile SDK 33
- Export global sqflite API
- iOS set minimum deployment target to 11.0
2.2.7
- Dart 3 support
2.2.6
- uri support for supported implementations.
2.2.5
- Fix concurrency issue in database worker pool (chriscui@google.com)
- add android
setLocaleAPI call support.
2.2.4+1
- Experimental logger support.
2.2.3-1
- strict-casts and sdk 2.18 support
2.2.2
- Fix iOS/MacOS FMDB include for non-swift project
2.2.1
- Allow multiple threads on Android, thanks to zhenpingcui
2.2.1-1
- Fix iOS/MacOS FMDB include
2.2.0+3
- Implements
Database.queryCursor()andDatabase.rawQueryCursor() - Dependency update
- Initial support of cross isolate safe
- Transaction v2 update
2.1.0+1
- Android: fix parameter binding for non string parameters
- Android: fix unit test
2.0.4-dev.1
- Android: Allow turning on WAL in the manifest.
2.0.3+1
- MacOS: Fix crash when an invalid number of parameters is specified in the query
2.0.3
- iOS/Android: Flutter 3.0 support, makes all the channel calls happen on thread pool instead of the UI thread
- iOS/MacOS: make close happen in a background thread
2.0.2+1
- Android build: remove jcenter, compile sdk set to 31
2.0.1
- Bump default android thread priority to
THREAD_PRIORITY_DEFAULT
2.0.0+4
nnbdsupport
1.3.2+3
- iOS/macOS: Update FMDB to 2.7.5+
- android: Update gradle to 6.5
- fix logs on iOS
1.3.1+2
- add
databaseFactorysetter to change the default sqflite factory. - Fix empty Blob returned as null on MacOS/iOS
- Test using
integration_test
1.3.0+2
- Add sqflite_common dependency
1.2.2+1
- Fix iOS warning on FMDB import
- Support pedantic 1.9
- Check arguments in debug mode (print errors only)
1.2.1
- Support Android embedding v2
- Add private mixin
- Support iOS/MacOS incremental build
1.2.0
- Add MacOS support
1.1.8
- support
deleteDatabaseafter hot-restart. Existing, if any, single instance database ìs closed before deletion
1.1.7+3
- Bump flutter/dart dependency version (1.9.1/2.5.0)
- Fix hot and warm restart for opened databases on Android
- Add code documentation, code coverage and build badges
- Fix ios example build
1.1.6+5
- Open database in a background thread on Android.
- Prevent database deletion on Android when opening a corrupted database in read-only.
- Fix hot restart ROLLBACK warning
- Fix indexed parameter binding on iOS
1.1.5
- Add
databaseExistsas a top level function - handle relative path in
databaseExistsanddeleteDatabase - Supports hot-restart while in a transaction on iOS and Android by recovering the database from the
native world and executing
ROLLBACKto preventSQLITE_BUSYerror - If in a transaction, execute
ROLLBACKbefore closing to preventSQLITE_BUSYerror
1.1.4
- Make all db operation happen in a separate thread on iOS
1.1.3
- Fix deadlock issue on iOS when using isolates
1.1.2
- Sqflite now uses a thread handler with a background thread priority by default on Android
1.1.1
- Use mixin and extract non flutter code into
sqlite_api.dart - Deprecate
SqfliteOptionswhich is only used internally
1.1.0
-
Breaking change. Migrate from the deprecated original Android Support Library to AndroidX. This shouldn't result in any functional changes, but it requires any Android apps using this plugin to also migrate if they're using the original support library.
You might say thay version should be bumped to 2.0.0, however it is just a tooling issue, code is not changed. This is a copy of the changes made in the flutter plugins
1.0.0
- Upgrade 0.13.0 version as 1.0.0
- Remove deprecated API (applyBatch, apply)
0.13.0
- Add support for
continueOrErrorfor batches
0.12.0
- iOS objective C prefix added to prevent conflict
- on iOS create the directory of the database if it does not exist
0.11.2
- add
Database.isOpenwhich becomes false once the database is closed
0.11.1
- add
Sqflite.hexto allow querying on blob fields
0.11.0
- add
getDatabasesPathto use as the base location to create a database - Warning: database are now single instance by default (based on
path), to use the old behavior usesingleInstance = falsewhen opening a database - dart2 stable support
0.10.0
- Preparing for 1.0
- Remove deprecated methods (re-entrant transactions)
- Add
Transaction.batch - Show developer warning to prevent deadlock
0.9.0
- Support for in-memory database (
:memory:path) - Support for single instance
- new database factory for handling the new options
0.8.9
- Upgrade to sdk 27
0.8.8
- Allow testing for constraint exception
0.8.6
- better sql error report
- catch android native errors
- no longer print an error when deleting a database fails
0.8.4
- Add read-only support using
openReadOnlyDatabase
0.8.3
- Allow running a batch during a transaction using
Transaction.applyBatch - Restore
Batch.committo use outside a transaction
0.8.2
- Although already in a transaction, allow creating nested transactions during open
0.8.1
- New
Transactionmechanism not using Zone (old one still supported for now) - Start using
Batch.applyinstead ofBatch.commit - Deprecate
Database.inTransactionandDatabase.synchronizedso that Zones are not used anymore
0.7.1
- add
Batch.query,Batch.rawQueryandBatch.execute - pack query result as colums/rows instead of List
0.7.0
- Add support for
--preview-dart-2
0.6.2+1
- Add longer description to pubspec.yaml
0.6.2
- Fix travis warning
0.6.1
- Add Flutter SDK constraint to pubspec.yaml
0.6.0
- add support for
onConfigureto allow for database configuration
0.5.0
- Escape table and column name when needed in insert/update/query/delete
- Export ConflictAlgorithm, escapeName, unescapeName in new sql.dart
0.4.0
- Add support for Batch (insert/update/delete)
0.3.1
- Remove temp concurrency experiment
0.3.0
2018/01/04
- Breaking change. Upgraded to Gradle 4.1 and Android Studio Gradle plugin 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in order to use this version of the plugin. Instructions can be found here.
0.2.4
- Dependency on synchronized updated to >=1.1.0
0.2.3
- Make Android sends the reponse in the same thread then the caller to prevent unexpected behavior when an error occured
0.2.2
- Fix unchecked warning on Android
0.2.0
- Use NSOperationQueue for all db operation on iOS
- Use ThreadHandler for all db operation on Android
0.0.3
- Add exception handling
0.0.2
- Add sqlite helpers based on Razvan Lung suggestions
0.0.1
- Initial experimentation
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add sqflitepubspec.yaml
name: sqflite
repository: https://github.com/tekartik/sqflite/tree/master/sqflite
issue_tracker: https://github.com/tekartik/sqflite/issues
description: Flutter plugin for SQLite, a self-contained, high-reliability,
embedded, SQL database engine.
version: 2.4.5
# This package supports all platforms listed below.
platforms:
android:
ios:
macos:
topics:
- sql
- database
funding:
- https://github.com/sponsors/alextekartik
environment:
sdk: ^3.12.0
# Flutter versions prior to 3.7 did not support the
# sharedDarwinSource option.
flutter: ">=3.44.0"
flutter:
plugin:
platforms:
android:
default_package: sqflite_android
ios:
default_package: sqflite_darwin
macos:
default_package: sqflite_darwin
dependencies:
flutter:
sdk: flutter
sqflite_android: ">=2.4.5 <4.0.0"
sqflite_darwin: ">=2.4.3 <4.0.0"
sqflite_platform_interface: ">=2.4.1 <4.0.0"
sqflite_common: ">=2.5.9 <4.0.0"
path: ">=1.8.0 <3.0.0"
dev_dependencies:
flutter_lints: ">=5.0.0"
process_run: ">=0.12.0"
http: ">=0.13.0"
flutter_test:
sdk: flutter
test_api: ">=0.2.19"
pub_semver: ">=2.0.0"
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.1.0 | On demand | Download | 91fa2623…7cc18f |
| 0.2.0 | On demand | Download | 5613283b…983ecf |
| 0.2.1 | On demand | Download | 7beff1ba…ae013b |
| 0.2.2 | On demand | Download | 62dbee43…cf85af |
| 0.2.3 | On demand | Download | 2e501055…7ef88e |
| 0.2.4 | On demand | Download | c9aea2b5…483fd9 |
| 0.3.0 | On demand | Download | 3a7bbc59…cc292f |
| 0.3.1 | On demand | Download | 32b5d49f…317956 |
| 0.4.0 | On demand | Download | 6a7ddc33…d6a272 |
| 0.5.0 | On demand | Download | e29c2c87…d44667 |
| 0.6.0 | On demand | Download | 67cd5b88…348482 |
| 0.6.1 | On demand | Download | 8e85d3cf…cff891 |
| 0.6.2 | On demand | Download | 1ac6ed44…c13c05 |
| 0.6.2+1 | On demand | Download | 89c5712a…a924db |
| 0.6.2+2 | On demand | Download | 0c715ec3…908e79 |
| 0.7.0 | On demand | Download | ba248e42…6e4a21 |
| 0.7.1 | On demand | Download | c90f8b73…46558d |
| 0.8.0 | On demand | Download | 0994f2f4…3c404f |
| 0.8.0+1 | On demand | Download | de8e39b6…e4aaa5 |
| 0.8.1 | On demand | Download | 0f753646…91e503 |
| 0.8.2 | On demand | Download | ebeee174…a6df65 |
| 0.8.3 | On demand | Download | e41083ff…e0e5b4 |
| 0.8.4 | On demand | Download | 09c69f60…319262 |
| 0.8.5 | On demand | Download | 6fa90a84…2ab758 |
| 0.8.6 | On demand | Download | 1e1e7fce…0e270b |
| 0.8.7 | On demand | Download | 565fe1b5…a94d6b |
| 0.8.8 | On demand | Download | 1bd1bcff…24f161 |
| 0.8.9 | On demand | Download | 636817de…705150 |
| 0.9.0 | On demand | Download | 54897d1c…2a0b0e |
| 0.10.0-dev.1 | On demand | Download | defb0b43…b10901 |
| 0.10.0-dev.2 | On demand | Download | 2cf68cb2…a2d58e |
| 0.10.0 | On demand | Download | 27a7db95…610123 |
| 0.11.0 | On demand | Download | 092e31db…fbb4ce |
| 0.11.0+1 | On demand | Download | 60e7547a…3e42ff |
| 0.11.0+2 | On demand | Download | 2c19208c…f40b36 |
| 0.11.0+3 | On demand | Download | c7471873…92a6e1 |
| 0.11.0+4 | On demand | Download | 6deff408…720ce2 |
| 0.11.0+5 | On demand | Download | e2f6d891…ea7ed2 |
| 0.11.1 | On demand | Download | 584e2f42…c0f633 |
| 0.11.2 | On demand | Download | e8792f15…da8360 |
| 0.11.2+1 | On demand | Download | 5fc4e6de…439e5f |
| 0.11.2+2 | On demand | Download | ba115757…a4e74d |
| 0.11.2+3 | On demand | Download | e27ce4ca…6f0ab9 |
| 0.11.2+4 | On demand | Download | f3c09903…2dbf29 |
| 0.12.0 | On demand | Download | 68516e4f…c3ea24 |
| 0.12.1 | On demand | Download | 9752251e…13cbe8 |
| 0.12.2 | On demand | Download | 20de5137…729414 |
| 0.12.2+1 | On demand | Download | c6cc4d89…7bff65 |
| 0.12.3-dev.1 | On demand | Download | f1a761f3…541e1d |
| 0.13.0-dev.1 | On demand | Download | ff8b8e94…4bf6c5 |
| 0.13.0 | On demand | Download | 76ab6824…59348a |
| 0.13.0+1 | On demand | Download | e67aa086…4cd862 |
| 1.0.0 | On demand | Download | 62c6283e…04edcc |
| 1.1.0-dev.1 | On demand | Download | 2e99a252…1bcc05 |
| 1.1.0 | On demand | Download | d0021819…dd0ad7 |
| 1.1.0+1 | On demand | Download | bf96f368…29942a |
| 1.1.1 | On demand | Download | 0bc4a782…396daf |
| 1.1.2-dev | On demand | Download | aa520b53…8268d8 |
| 1.1.2 | On demand | Download | 4cfbbdc8…6f6b20 |
| 1.1.3-dev | On demand | Download | 01c89514…85e50c |
| 1.1.3 | On demand | Download | bff557ba…199105 |
| 1.1.4-dev.1 | On demand | Download | 635cc073…345467 |
| 1.1.5-dev.1 | On demand | Download | e49c0367…a16995 |
| 1.1.5-dev.2 | On demand | Download | ace2a076…82a570 |
| 1.1.5-dev.3 | On demand | Download | c80bcfad…afc9d8 |
| 1.1.5 | On demand | Download | 9875ea8e…e21001 |
| 1.1.6-dev.1 | On demand | Download | 83dd533d…e30040 |
| 1.1.6 | On demand | Download | ad67e166…6edffc |
| 1.1.6+1 | On demand | Download | 6f1a8e30…a632b1 |
| 1.1.6+2 | On demand | Download | 8e63091a…857ec5 |
| 1.1.6+3 | On demand | Download | 0746cd63…da36db |
| 1.1.6+4 | On demand | Download | 87d2e141…d52aa5 |
| 1.1.6+5 | On demand | Download | 7da7e352…62374b |
| 1.1.7-dev.1 | On demand | Download | 60c629e2…9f8a4f |
| 1.1.7 | On demand | Download | 63661577…9f4e05 |
| 1.1.7+1 | On demand | Download | 269baa55…e32479 |
| 1.1.7+2 | On demand | Download | 6baa7eac…c623fc |
| 1.1.7+3 | On demand | Download | 9b77ed60…12b8ed |
| 1.1.8 | On demand | Download | 4f3af79e…e4a7cf |
| 1.2.0-dev.1 | On demand | Download | 4c644286…0c8f3f |
| 1.2.0 | On demand | Download | 1727e662…a7f24d |
| 1.2.1-dev.1 | On demand | Download | d7e329f6…3d940a |
| 1.2.1-dev.2 | On demand | Download | 81a3f20b…199d09 |
| 1.2.1-dev.3 | On demand | Download | 8df63d82…a13a6b |
| 1.2.1 | On demand | Download | 8b3e66b7…2f1d98 |
| 1.2.2-dev.1 | On demand | Download | d03a1d50…15770f |
| 1.2.2 | On demand | Download | a6fea4ba…2c0342 |
| 1.2.2+1 | On demand | Download | 553b3824…fc0c4d |
| 1.3.0-dev.1 | On demand | Download | c88f11ca…6665a3 |
| 1.3.0-dev.2 | On demand | Download | 83cd08e5…07f5d6 |
| 1.3.0 | On demand | Download | e9d202de…d01c70 |
| 1.3.0+1 | On demand | Download | ce0e6be9…79fe56 |
| 1.3.0+2 | On demand | Download | 74a103f5…31b8ea |
| 1.3.1-dev.1 | On demand | Download | 99c93d42…d31a4d |
| 1.3.1 | On demand | Download | b033431b…79170e |
| 1.3.1+1 | On demand | Download | 80cef79d…2c6073 |
| 1.3.1+2 | On demand | Download | 67ac4e54…6e35a0 |
| 1.3.2-dev.1 | On demand | Download | a72df247…088b95 |
| 1.3.2 | On demand | Download | 90d5c031…9d00f5 |
| 1.3.2+1 | On demand | Download | 2a355f4c…f5a960 |
| 1.3.2+2 | On demand | Download | 2bfaf8e8…5614f3 |
| 1.3.2+3 | On demand | Download | 72904970…b3147c |
| 1.3.2+4 | On demand | Download | 00f32a18…5cc2a4 |
| 1.3.3-dev.1 | On demand | Download | 1698a14b…fd4ef1 |
| 2.0.0-nullsafety.0 | On demand | Download | f3322139…e4be7a |
| 2.0.0-nullsafety.1 | On demand | Download | ecf6e0f2…5737dd |
| 2.0.0-nullsafety.2 | On demand | Download | 050033b0…fb8d4b |
| 2.0.0-nullsafety.3 | On demand | Download | ef7d540d…29a9a8 |
| 2.0.0 | On demand | Download | 1145f3f3…7b7e70 |
| 2.0.0+1 | On demand | Download | fe651109…b551c4 |
| 2.0.0+2 | On demand | Download | 86893071…b6aa96 |
| 2.0.0+3 | On demand | Download | 643ab681…d42d53 |
| 2.0.0+4 | On demand | Download | 67fa2c95…e905c2 |
| 2.0.1 | On demand | Download | 5e2704b2…0a38fb |
| 2.0.2 | On demand | Download | f83e4c46…8967f6 |
| 2.0.2+1 | On demand | Download | 51c09d41…3735d4 |
| 2.0.3-dev.1 | On demand | Download | 058b8e33…9d971c |
| 2.0.3-dev.2 | On demand | Download | 6efc68f9…9855c2 |
| 2.0.3-dev.3 | On demand | Download | 6c923199…3ad11d |
| 2.0.3-dev.4 | On demand | Download | 25380c53…077317 |
| 2.0.3-dev.5 | On demand | Download | fb0b0223…e2351a |
| 2.0.3 | On demand | Download | 871add98…d1dc23 |
| 2.0.3+1 | On demand | Download | b3a8307b…9281cf |
| 2.0.4-dev.1 | On demand | Download | e57a6a49…d8dad6 |
| 2.1.0 | On demand | Download | 0128af22…185523 |
| 2.1.0+1 | On demand | Download | f9120539…d14e16 |
| 2.2.0-dev.0 | On demand | Download | 29168f9b…379cf1 |
| 2.2.0-dev.1 | On demand | Download | 9a823790…85faa9 |
| 2.2.0-dev.2 | On demand | Download | 25b87e50…70394f |
| 2.2.0-dev.3 | On demand | Download | f4bc3377…2bb2f7 |
| 2.2.0 | On demand | Download | a9a8c6df…0c2753 |
| 2.2.0+1 | On demand | Download | 2a4e5acb…78cb9e |
| 2.2.0+2 | On demand | Download | 90cf48ff…fc1297 |
| 2.2.0+3 | On demand | Download | d21c0228…76d161 |
| 2.2.1-1 | On demand | Download | f275d4bd…530004 |
| 2.2.1 | On demand | Download | a23a7dcf…f42c31 |
| 2.2.2-1 | On demand | Download | 67e8832e…f8ad1d |
| 2.2.2-2 | On demand | Download | 7e7ee0be…606dae |
| 2.2.2-3 | On demand | Download | cc134627…23adc0 |
| 2.2.2 | On demand | Download | 2b1697c7…46c276 |
| 2.2.3-1 | On demand | Download | 608f197d…7315fe |
| 2.2.3 | On demand | Download | 067ab48d…6d0688 |
| 2.2.4-dev.1 | On demand | Download | ca938428…b19048 |
| 2.2.4 | On demand | Download | a33cd945…ca4f74 |
| 2.2.4+1 | On demand | Download | 78324387…fd9a4f |
| 2.2.5-0 | On demand | Download | 63f6cf3d…6ef888 |
| 2.2.5 | On demand | Download | 851d5040…bf8ecc |
| 2.2.6-1 | On demand | Download | 24680926…b01431 |
| 2.2.6 | On demand | Download | 500d6fec…1fa758 |
| 2.2.7 | On demand | Download | e7dfb648…4ade00 |
| 2.2.8-1 | On demand | Download | 7c76b9c9…39a649 |
| 2.2.8-2 | On demand | Download | 3aa1c328…901dd0 |
| 2.2.8-3 | On demand | Download | 85c2ea1e…8e960b |
| 2.2.8-4 | On demand | Download | 65a18fd8…a81511 |
| 2.2.8 | On demand | Download | 8453780d…55533f |
| 2.2.8+1 | On demand | Download | acf091c6…bfb079 |
| 2.2.8+2 | On demand | Download | 3a82c9a2…9caa00 |
| 2.2.8+3 | On demand | Download | 41498eed…609f27 |
| 2.2.8+4 | On demand | Download | b4d6710e…37a0b9 |
| 2.3.0-0 | On demand | Download | 990a4a45…144fb0 |
| 2.3.0 | On demand | Download | 591f1602…c38a9a |
| 2.3.1 | On demand | Download | c2c32eb0…891ddc |
| 2.3.2-2 | On demand | Download | 303833cb…8ea5ae |
| 2.3.2 | On demand | Download | a9016f49…e798c6 |
| 2.3.3 | On demand | Download | 5ce2e1a1…c9308c |
| 2.3.3+1 | On demand | Download | a43e5a27…66f16d |
| 2.3.3+2 | On demand | Download | ff5a2436…e8a788 |
| 2.4.0-0 | On demand | Download | 3d8fe831…6ddeeb |
| 2.4.0 | On demand | Download | 79a297dc…f2ad62 |
| 2.4.1 | On demand | Download | 2d729946…9454bb |
| 2.4.2 | On demand | Download | e2297b1d…585d03 |
| 2.4.2+1 | On demand | Download | 564cfed0…a0250a |
| 2.4.3 | On demand | Download | 58a799e6…12b082 |
| 2.4.4 | On demand | Download | 54ad23e2…0cbfe0 |
| 2.4.4+1 | On demand | Download | 7419d02d…8c010e |
| 2.4.4+2 | On demand | Download | 273218a1…2eb8fe |
| 2.4.5 | Cached · Upstream SHA-256 matched | Download | 21a9750d…90c06a |
Dependencies
flutter {
"sdk": "flutter"
}
path "\u003e=1.8.0 \u003c3.0.0"
sqflite_android "\u003e=2.4.5 \u003c4.0.0"
sqflite_common "\u003e=2.5.9 \u003c4.0.0"
sqflite_darwin "\u003e=2.4.3 \u003c4.0.0"
sqflite_platform_interface "\u003e=2.4.1 \u003c4.0.0"