Начинать
Используйте sqflite для работы sqlite
sqflite: ^1.1.7+1
Вы можете сначала прочитать официальное руководство по sqlite, я думаю, что оно довольно хорошо написано, намного лучше, чем другие китайские версии руководства по статье (вы вообще не можете его прочитать).(кроме моего)
Официальное руководство по sqlite
инициализировать БД
использоватьopenDatabase
инициализация
Синтаксис openDatabaseFuture<Database> openDatabase(String path, {int version, FutureOr<void> Function(Database) onConfigure, FutureOr<void> Function(Database, int) onCreate, FutureOr<void> Function(Database, int, int) onUpgrade, FutureOr<void> Function(Database, int, int) onDowngrade, FutureOr<void> Function(Database) onOpen, bool readOnly = false, bool singleInstance = true})
База данных должна быть открыта перед инициализацией
1. Откройте базу данных
penDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
)
2. Создайте новую таблицу
По умолчанию таблицы нет.Если вы создаете новую таблицу напрямую, вам нужно создать таблицу самостоятельно, затем вам нужно определить, существует ли таблица.
ноsqflite
Существует хук onCreate, который выполняется при первом создании базы данных.
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
);
3. Добавить версию
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
// 版本
version: 1,
);
Роль версии заключается в том, что при изменении версииonCreate
будет казнен.
код
import 'dart:io';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
String createSql = '''
CREATE TABLE <表名称> (
id INTEGER,
name STRING,
);
''';
Database db = await openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(createSql);
},
version: 1,
);
Таким образом, вы можете использовать db для работы с базой данных.
Работа с базой данных
собственная операция(начинается с сырого), и операции, более подходящие для флаттера(не знаю подойдет или нет, но для этого и сделано)
В sqflite есть абстрактный класс DatabaseExecutor, перечисляю все операции
// 这部分是原生操作表(raw)
execute
rawInsert
rawDelete
rawUpdate
rawQuery
// 这部分是dart操作表方法
insert
query
update
delete
Собственная операционная таблица (необработанная)
метод
execute
rawInsert
rawDelete
rawUpdate
rawQuery
Напишите оператор sqlite напрямую, вторым необязательным параметром являются данные
Вторые данные подставляются в инструкцию sql, а данные в sql?
пример
rawInsert(
'INSERT INTO Test(name) VALUES(?)',
['name']
)
сырая вставка, rawDelete, сырое обновление, сырой запрос
В соответствии с добавлением, удалением, изменением и запросом соответственно, то как создать новую таблицу, статистические данные и т. д.?
Используйте выполнить.(Посмотрите внимательно, и вы обнаружите, что возвращаемое значение этого продукта недействительно, не паникуйте, это нормально)синтаксис sqlite
Если вы не знаете синтаксиса db, ничего страшного, Baidu или Google изучат его.
Нажмите, чтобы ввести грамматику sqlite в учебнике для новичков.
операционный стол для дротиков
метод
insert
query
update
delete
пример
1. Добавить
insert(
'<表名>',
{
"<字段名称>": '<值>'
},
conflictAlgorithm: ConflictAlgorithm.replace,
);
2. Запрос
- 1.1
db.query('<表名>')
- 1.2
db.query('<表名>', columns: ['字段1', '字段2'], where: '"字段名称" = ?', whereArgs: [字段值]);
необязательный параметр
{
bool distinct,
List<String> columns,
String where,
List<dynamic> whereArgs,
String groupBy,
String having,
String orderBy,
int limit,
int offset
}
3. Изменить
update(
'<表名>',
// 条件
where: "id = ?",
// 值
whereArgs: [id],
);
4. Удалить
delete(
'<表名>',
// 条件
where: "id = ?",
// 值
whereArgs: [id],
);
дела
await database.transaction((db) async {
await db.操作1
await db.操作2
// 只能使用内部的db参数操作
})
Пакетные операции
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();
Если все исполнениеexecute
, либо не нужно знать результат выполнения, тоcommit
могу добавить одинnoResult: true
await batch.commit(noResult: true);
Пакетные операции также пахнут транзакциями: если одна из них дает сбой, это эквивалентно никогда не выполнявшимся операциям. Однако он также обеспечивает мертвую операцию, которая может игнорировать сбой, а результаты других операций сохраняются и не подлежат откату.
commit(continueOnError: true);
Разбитые мысли: (лично я считаю, что пакетные операции не должны помещаться в транзакции)
закрытие
Также очень важно закрыть, не забудьте выпустить магию, иначе телефон может не выдержать.
Это не различает нативный синтаксис и синтаксис дротика, мы оставили поле таблицы операций
await database.close();
Вы можете написать закрытие на хук dispose
@override
void dispose(){
database.close();
super.dispose();
}
Если используется несколько интерфейсов, его не нужно закрывать (при закрытии приложение будет автоматически выпущено)
неподдерживаемый тип поля
DateTime
bool
Пожалуйста, не используйте вышеуказанные два типа