Flutter数据库Sqflite之增删改查
Flutter数据库Sqflite之增删改查
简介
- sqflite是Flutter的SQLite插件,支持iOS和Android,目前官方版本是sqflite1.1.3
- sqflite插件地址:https://pub.dartlang.org/packages/sqflite#-readme-tab-
- sqflite支持事务和批处理
- sqflite支持打开期间自动版本管理
- sqflite支持插入/查询/更新/删除查询的助手
- sqflite支持在iOS和Android上的后台线程中执行数据库操作
更多Flutter相关内容可以访问我的Github
关键API
- 获取数据库的路径
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
- 打开数据库
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)');
});
- 使用事务插入一条记录
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');
});
- 更新一条记录
int count = await database.rawUpdate(
'UPDATE Test SET name = ?, VALUE = ? WHERE name = ?',
['updated name', '9876', 'some name']);
print('updated: $count');
- 查询记录
List<Map> list = await database.rawQuery('SELECT * FROM Test');
- 查询总记录数
count = Sqflite.firstIntValue(await database.rawQuery('SELECT COUNT(*) FROM Test'));
- 删除一条记录
count = await database.rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);
- 关闭数据库
await database.close();
使用
- 首先创建model
class User {
String name;
int age;
int id;
Map<String, dynamic> toMap() {
var map = new Map<String, dynamic>();
map['name'] = name;
map['age'] = age;
map['id'] = id;
return map;
}
static User fromMap(Map<String, dynamic> map) {
User user = new User();
user.name = map['name'];
user.age = map['age'];
user.id = map['id'];
return user;
}
static List<User> fromMapList(dynamic mapList) {
List<User> list = new List(mapList.length);
for (int i = 0; i < mapList.length; i++) {
list[i] = fromMap(mapList[i]);
}
return list;
}
}
- 创建db_helper,数据库帮助类
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
final String tableName = "table_user";
final String columnId = "id";
final String columnName = "name";
final String columnAge = "age";
static Database _db;
Future<Database> get db async {
if (_db != null) {
return _db;
}
_db = await initDb();
return _db;
}
DatabaseHelper.internal();
initDb() async {
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'sqflite.db');
var ourDb = await openDatabase(path, version: 1, onCreate: _onCreate);
return ourDb;
}
//创建数据库表
void _onCreate(Database db, int version) async {
await db.execute(
"create table $tableName($columnId integer primary key,$columnName text not null ,$columnAge integer not null )");
print("Table is created");
}
//插入
Future<int> saveItem(User user) async {
var dbClient = await db;
int res = await dbClient.insert("$tableName", user.toMap());
print(res.toString());
return res;
}
//查询
Future<List> getTotalList() async {
var dbClient = await db;
var result = await dbClient.rawQuery("SELECT * FROM $tableName ");
return result.toList();
}
//查询总数
Future<int> getCount() async {
var dbClient = await db;
return Sqflite.firstIntValue(await dbClient.rawQuery(
"SELECT COUNT(*) FROM $tableName"
));
}
//按照id查询
Future<User> getItem(int id) async {
var dbClient = await db;
var result = await dbClient.rawQuery("SELECT * FROM $tableName WHERE id = $id");
if (result.length == 0) return null;
return User.fromMap(result.first);
}
//清空数据
Future<int> clear() async {
var dbClient = await db;
return await dbClient.delete(tableName);
}
//根据id删除
Future<int> deleteItem(int id) async {
var dbClient = await db;
return await dbClient.delete(tableName,
where: "$columnId = ?", whereArgs: [id]);
}
//修改
Future<int> updateItem(User user) async {
var dbClient = await db;
return await dbClient.update("$tableName", user.toMap(),
where: "$columnId = ?", whereArgs: [user.id]);
}
//关闭
Future close() async {
var dbClient = await db;
return dbClient.close();
}
}
- 在进行页面增删该查操作
class DataAppPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _DataAppPageState();
}
}
class _DataAppPageState extends State<DataAppPage> {
List<User> _datas = new List();
var db = DatabaseHelper();
Future<Null> _refresh() async {
_query();
}
@override
void initState() {
super.initState();
_getDataFromDb();
}
_getDataFromDb() async {
List datas = await db.getTotalList();
if (datas.length > 0) {
//数据库有数据
datas.forEach((user) {
User item = User.fromMap(user);
_datas.add(item);
});
} else {
//数据库没有数据
User user = new User();
user.name = "张三";
user.age = 10;
user.id = 1;
User user2 = new User();
user2.name = "李四";
user2.age = 12;
user2.id = 2;
await db.saveItem(user);
await db.saveItem(user2);
_datas.add(user);
_datas.add(user2);
}
setState(() {});
}
//添加
Future<Null> _add() async {
User user = new User();
user.name = "我是增加的";
user.age = 33;
await db.saveItem(user);
_query();
}
//删除,默认删除第一条数据
Future<Null> _delete() async {
List datas = await db.getTotalList();
if (datas.length > 0) {
//修改第一条数据
User user = User.fromMap(datas[0]);
db.deleteItem(user.id);
_query();
}
}
//修改,默认修改第一条数据
Future<Null> _update() async {
List datas = await db.getTotalList();
if (datas.length > 0) {
//修改第一条数据
User u = User.fromMap(datas[0]);
u.name = "我被修改了";
db.updateItem(u);
_query();
}
}
//查询
Future<Null> _query() async {
_datas.clear();
List datas = await db.getTotalList();
if (datas.length > 0) {
//数据库有数据
datas.forEach((user) {
User dataListBean = User.fromMap(user);
_datas.add(dataListBean);
});
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text("sqflite学习"),
centerTitle: true,
actions: <Widget>[
new PopupMenuButton(
onSelected: (String value) {
switch (value) {
case "增加":
_add();
break;
case "删除":
_delete();
break;
case "修改":
_update();
break;
case "查询":
_query();
break;
}
},
itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
new PopupMenuItem(value: "增加", child: new Text("增加")),
new PopupMenuItem(value: "删除", child: new Text("删除")),
new PopupMenuItem(value: "修改", child: new Text("修改")),
new PopupMenuItem(value: "查询", child: new Text("查询")),
])
],
),
body: RefreshIndicator(
displacement: 15,
onRefresh: _refresh,
child: ListView.separated(
itemBuilder: _renderRow,
physics: new AlwaysScrollableScrollPhysics(),
separatorBuilder: (BuildContext context, int index) {
return Container(
height: 0.5,
color: Colors.black38,
);
},
itemCount: _datas.length),
),
);
}
Widget _renderRow(BuildContext context, int index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.all(5),
child: Text("姓名:" + _datas[index].name)),
Padding(
padding: EdgeInsets.all(5),
child: Text("年龄:" + _datas[index].age.toString())),
],
);
}
}
Flutter数据库Sqflite之增删改查的更多相关文章
- Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)
1. Android的四大组件: (1)Activity 用户交互的UI界面 (2)Service 后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...
- ORM 实现数据库表的增删改查
这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...
- Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
- Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)
1. Android的四大组件: (1)Activity 用户交互的UI界面 (2)Service 后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- 十四:SpringBoot-配置MongoDB数据库,实现增删改查逻辑
SpringBoot-配置MongoDB数据库,实现增删改查逻辑 1.MongoDB数据库 1.1 MongoDB简介 1.2 MongoDB特点 2.SpringBoot整合MongoDB 2.1 ...
- Linq 数据库操作(增删改查)
Linq数据库增删改查 Linq是一种查询语言,集成包含在formwork中,包含在C#语言中,它的作用是降低查询的门槛,提高开发效率,是我们必须掌握的技术之一,下面是我自己对linq数据库操作的方法 ...
- 利用SQLiteOpenHelper创建数据库,进行增删改查操作
Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写 ...
- 使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能
此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的mode ...
随机推荐
- laravel整合workerman做消息推送系统
官方建议分离 workerman和mvc框架的结合,我去,这不是有点脑缺氧吗? 大量的业务逻辑,去独立增加方法和类库在写一次,实际业务中是不现实和不实际的 gateway增加一些这方面的工作,但是我看 ...
- :before和::before的区别
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示, ...
- MacBookPro磁盘空间不够
256G的SSD还是快被占满了,剩余12G,本来一切运行正常. 要往U盘里拷点资料,突然电脑就罢工了,cleanMyMac 显示磁盘容量剩余 1.8G. finder 罢工,无法重启,无法强退. 无法 ...
- MYSQL转换编码的解决方法
MYSQL转换编码的解决方法 一.在utf8的mysql下 得到中文‘游客’的gbk下的16进制编码 mysql> SELECT hex(CONVERT( '游客' USING gbk )); ...
- flutter学习之二Material Design设计规范
前言: 最近在自学flutter跨平台开发,从学习的过程来看真心感觉不是那么一件特别容易的事.不但要了解语法规则, 还要知晓常用控件,和一些扩展性的外延知识,所以套一句古人的话“路漫漫其修远矣,无将上 ...
- JAVA RPC (五) 之thrift序列化RPC消息体
让大家久等了.继续更新thrift序列化的消息体,下面我们一步一步的看一看thrift的rpc是怎么实例化消息体的. 首先我们先准备一个request文件 namespace java bky str ...
- OO第一单元总结与心得体会
一.结构度量 1. UML类图 第一次作业 第二次作业 第三次作业 2. 复杂度分析 (1)方法复杂度 ev, iv, v这几栏,分别代指基本复杂度(Essential Complexity (e ...
- YOLO V3 错误总结
问题1 TypeError: function takes exactly 1 argument (3 given) 报错说PIL库中的函数只接收到一个参数,应该给三个,自己在这里记录下解决方法,出错 ...
- 共享文件 Ubuntu下安装Samba与Windows
Author:Xianghai Ding.Date:2019/01/08**************************************************************安装 ...
- 2019/4/22 拓扑排序的高效写法. 模板题HDU1285:确定比赛名次
传送门 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现 ...