package:path/path.dart
是一个 Dart 包,它提供了一组函数来处理文件路径。使用其来进行跨平台的文件路径处理。
零散的东西
1.Future
<T>是一种非常重要的异步编程构建块,它允许你在进行耗时操作(如网络请求、数据库查询或文件读写)时保持程序的响应性。Future
对象可以通过 async
和 await
关键字来进行异步编程。T
是 Future
完成时返回的结果的类型。
响应性:提高用户体验,不必在异步处理时一直在转圈圈
2.Map<String, dynamic>
是 Dart 编程语言中的一种数据结构,表示一个键值对的映射集合,其中键是 String
类型,dynamic
类型通常用于与 JSON 数据交互,因为 JSON 数据本质上是动态的,可以包含不同类型的值。
3.conflictAlgorithm
是 SQLite 数据库中的一个参数,用于指定在插入、更新或删除操作中如何处理冲突。
常见策略:abort replace rollback fail ignore ...
4.database?.query('items') ?? [] ?
查表操作
"?"空安全成员访问操作符
先判断database是否为空,不为空则执行之后操作,否则直接返回Null
5.database 数据库操作对象常见操作有:
增删改查及,自定义sql语句的增删改查 ,path,isOpen..
6.建库时建表,如要在建库后改表的话有些麻烦
并不是每次启动都会建表
Future<void> initializeDatabase() async {
// 使用 path 库获取数据库文件的路径
String path = join(await getDatabasesPath(), 'my_database.db');
// 打开数据库,如果数据库不存在则创建它
database = await openDatabase(
path,
version: 1,
onCreate: (db, version) {
// 在数据库创建时创建表
return db.execute(
'CREATE TABLE items(id INTEGER PRIMARY KEY, secret TEXT, sign TEXT)',
);
},
);
}
如果在建表后插入该表一个不存在的字段则会报错(需要在该表再新建字段)
导入与使用
依赖导入:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.3.0
具体使用:
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
Database? database;
@override
void initState() {
super.initState();
initializeDatabase();
}
// 初始化数据库
Future<void> initializeDatabase() async {
// 使用 path 库获取数据库文件的路径
String path = join(await getDatabasesPath(), 'my_database.db');
// 打开数据库,如果数据库不存在则创建它
database = await openDatabase(
path,
version: 1,
onCreate: (db, version) {
// 在数据库创建时创建表
return db.execute(
'CREATE TABLE items(id INTEGER PRIMARY KEY, name TEXT)',
);
},
);
}
// 插入数据
Future<void> insertItem(String name) async {
await database?.insert(
'items',
{'name': name},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
// 查询数据
Future<List<Map<String, dynamic>>> fetchItems() async {
return await database?.query('items') ?? [];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SQLite Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
// 插入数据
await insertItem('Item 1');
},
child: Text('Insert Item'),
),
ElevatedButton(
onPressed: () async {
// 查询数据
List<Map<String, dynamic>> items = await fetchItems();
print('Fetched items: $items');
},
child: Text('Fetch Items'),
),
],
),
),
);
}
}
sql默认存储位置