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之增删改查的更多相关文章

  1. Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...

  2. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...

  3. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  4. Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...

  5. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  6. 十四:SpringBoot-配置MongoDB数据库,实现增删改查逻辑

    SpringBoot-配置MongoDB数据库,实现增删改查逻辑 1.MongoDB数据库 1.1 MongoDB简介 1.2 MongoDB特点 2.SpringBoot整合MongoDB 2.1 ...

  7. Linq 数据库操作(增删改查)

    Linq数据库增删改查 Linq是一种查询语言,集成包含在formwork中,包含在C#语言中,它的作用是降低查询的门槛,提高开发效率,是我们必须掌握的技术之一,下面是我自己对linq数据库操作的方法 ...

  8. 利用SQLiteOpenHelper创建数据库,进行增删改查操作

    Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写 ...

  9. 使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能

    此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的mode ...

随机推荐

  1. 19.3.25 sql查询语句

    1.单表查询:select * from 表名 where id = 111 2.查询表内数据并以id排序:select * from 表名 order by id (降序:desc/升序:asc) ...

  2. as项目找不到id

    是app目录下一个iml文件的问题,从备份恢复就好了

  3. day 24 二十四、组合、继承、方法重写和重用、super()

    一.组合 1.定义:自定义类的对象作为类的属性 A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B类组合到一起 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能 2. ...

  4. PAT甲级1123 Is It a Complete AVL Tree【AVL树】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...

  5. Spring Cloud 学习记录

    Spring Cloud中文网 拜托!面试不要再问我Spring Cloud底层原理 SpringCloud简介与5大常用组件 Spring Cloud在国内中小型公司能用起来吗?

  6. ide phpStorm 配置PHP路径并本地执行PHP脚本

    1.打开设置(File - Settings) 2. 3. 4.到需要执行脚本的文件处,右击 - Run 5.如果本地还未安装PHP,可以下载Xampp,并将PHP目录新增至系统环境变量Path处,重 ...

  7. git 远程

    git remote add origin [远程仓库地址]

  8. 使用Eclipse来操作HDFS的文件

    一.常用类 1.Configuration Hadoop配置文件的管理类,该类的对象封装了客户端或者服务器的配置(配置集群时,所有的xml文件根节点都是configuration) 创建一个Confi ...

  9. 2017(2)数据库设计,数据库设计过程,ER模型,规范化理论

    试题二(共 25 分〉 阅读以下关于系统数据分析与建模的叙述,在答题纸上回答问题1 至问题 3. [说明] 某软件公司受快递公司委托,拟开发一套快递业务综合管理系统,实现快递单和物流信息的综合管理.项 ...

  10. war 包tomcat部署和maven的tomcat插件部署的不同

    不用插件 1在linux服务器上下载号tomcat 或者上传tomcat 2上传war包,最好创建一个目录房war包,和tomcat 3解压war包,jar -xvf war   或者unzip wa ...