flutter 数据存储 SP和sqlite
添加插件:
shared_preferences: ^0.4.2
path_provider: ^1.2.0
sqflite: ^0.12.0
import 'dart:async';
import 'dart:io'; import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sqflite/sqflite.dart'; String username = ''; String pwd = ''; const String USERNAME = 'username'; const String PWD = 'pwd'; class DataAppPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return new _DataAppPageState();
}
} class _DataAppPageState extends State<DataAppPage> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
title: new Text('数据存储 学习'),
centerTitle: true,
),
body: new ListView(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
child: new Text('对用户名和密码进行增删改查的操作'),
),
new Padding(
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
child: new LoginWidget(),
),
new Padding(
padding: const EdgeInsets.only(
top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
child: new HandleSPDataWidget(),
),
new Padding(
padding: const EdgeInsets.only(
top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
child: new HandleSQLiteDataWidget(),
),
new Padding(
padding: const EdgeInsets.only(
top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
child: new HandleFileDataWidget(),
),
],
),
);
}
} class HandleSPDataWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _HandleSPDataWidgetState();
}
} class _HandleSPDataWidgetState extends State<HandleSPDataWidget> {
var _result; _add() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(USERNAME, username); prefs.setString(PWD, pwd); setState(() {
_result = '_add 成功 请点击查验证结果';
});
} _delete() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); //KEY
prefs.remove(USERNAME);
prefs.remove(PWD); //清空所有KEY
//prefs.clear(); setState(() {
_result = '_delete 成功, 请点击查验证结果';
});
} _update() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(USERNAME, 'Paul'); prefs.setString(PWD, '654321'); setState(() {
_result = '_update 成功,用户名修改为Paul,密码修改为654321, 请点击查验证结果';
});
} _query() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); String username = prefs.get(USERNAME); String pwd = prefs.get(PWD); print('$username'); print('$pwd'); setState(() {
_result = '_query 成功: username: $username pwd: $pwd';
});
} @override
Widget build(BuildContext context) {
// TODO: implement build return new Column(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('shared_preferences用法'),
), new Row(
children: <Widget>[
new RaisedButton(
textColor: Colors.black,
child: new Text('增'),
onPressed: _add
),
new RaisedButton(
textColor: Colors.black,
child: new Text('删'),
onPressed: _delete),
new RaisedButton(
textColor: Colors.black,
child: new Text('改'),
onPressed: _update),
new RaisedButton(
textColor: Colors.black,
child: new Text('查'),
onPressed: _query),
],),
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('结果:$_result'),
),
],
);
}
} class HandleSQLiteDataWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _HandleSQLiteDataWidgetState();
}
} class _HandleSQLiteDataWidgetState extends State<HandleSQLiteDataWidget> {
// TODO: implement build String dbName = 'user.db';
String dbPath; String sql_createTable =
'CREATE TABLE user_table (id INTEGER PRIMARY KEY, username TEXT,pwd Text)'; String sql_query_count = 'SELECT COUNT(*) FROM user_table'; String sql_query = 'SELECT * FROM user_table'; var _result; Future<String> _createNewDb(String dbName) async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
print(documentsDirectory); String path = join(documentsDirectory.path, dbName); if (await new Directory(dirname(path)).exists()) {
await deleteDatabase(path);
} else {
try {
await new Directory(dirname(path)).create(recursive: true);
} catch (e) {
print(e);
}
}
return path;
} _create() async {
dbPath = await _createNewDb(dbName);
Database db = await openDatabase(dbPath); await db.execute(sql_createTable);
await db.close();
setState(() {
_result = '创建user.db成功,创建user_table成功';
});
} _add() async { Database db = await openDatabase(dbPath); String sql =
"INSERT INTO user_table(username,pwd) VALUES('$username','$pwd')";
await db.transaction((txn) async {
int id = await txn.rawInsert(sql);
}); await db.close(); setState(() {
_result = "插入username=$username,pwd=$pwd数据成功";
});
} _delete() async {
Database db = await openDatabase(dbPath); String sql = "DELETE FROM user_table WHERE id = ?"; int count = await db.rawDelete(sql, ['1']); await db.close(); setState(() {
if (count == 1) {
_result = "删除成功,请查看";
} else {
_result = "删除失败,请看log";
}
});
} _update() async {
Database db = await openDatabase(dbPath);
String sql = "UPDATE user_table SET pwd = ? WHERE id = ?";
int count = await db.rawUpdate(sql, ["654321", '1']);
print(count);
await db.close();
setState(() {
_result = "更新数据成功,请查看";
});
} _queryNum() async {
Database db = await openDatabase(dbPath);
int count = Sqflite.firstIntValue(await db.rawQuery(sql_query_count));
await db.close();
setState(() {
_result = "数据条数:$count";
});
} _query() async {
Database db = await openDatabase(dbPath);
List<Map> list = await db.rawQuery(sql_query);
await db.close();
setState(() {
_result = "数据详情:$list";
});
} @override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('sqflite用法'),
),
new Row(
children: <Widget>[
new RaisedButton(
textColor: Colors.black,
child: new Text('创建'),
onPressed: _create),
new RaisedButton(
textColor: Colors.black, child: new Text('增'), onPressed: _add),
new RaisedButton(
textColor: Colors.black,
child: new Text('删'),
onPressed: _delete),
new RaisedButton(
textColor: Colors.black,
child: new Text('改'),
onPressed: _update),
],
),
new Row(
children: <Widget>[
new RaisedButton(
textColor: Colors.black,
child: new Text('查条数'),
onPressed: _queryNum),
new RaisedButton(
textColor: Colors.black,
child: new Text('查详情'),
onPressed: _query),
],
),
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('结果:$_result'),
),
],
);
}
} class HandleFileDataWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _HandleFileDataWidgetState();
}
} class _HandleFileDataWidgetState extends State<HandleFileDataWidget> {
// TODO: implement build String tempPath; String appDocPath; String sdCardPath; var _result; _add() async { File file = new File('$tempPath/user.txt');
await file.writeAsString('用户名:$username\n密码:$pwd');
setState(() {
_result = '写入成功,请查询';
});
} _delete() {
File file = new File('$tempPath/user.txt');
file.deleteSync(recursive: false);
setState(() {
_result = '删除成功,请查看';
});
} _update() async {
File file = new File('$tempPath/user.txt');
await file.writeAsString('用户名:Paul\n密码:654321');
setState(() {
_result = '修改成功,请查询';
});
} _query() async {
try {
File file = new File('$tempPath/user.txt');
_result = '查询成功\n' + await file.readAsString();
} on Exception catch (e) {
_result = ' exception: $e';
} setState(() {});
} void _requestTempDirectory() async {
Directory tempDir = await getTemporaryDirectory();
setState(() {
tempPath = tempDir.path;
});
} void _requestAppDocumentsDirectory() async {
Directory appDocDir = await getApplicationDocumentsDirectory();
setState(() {
appDocPath = appDocDir.path;
});
} void _requestExternalStorageDirectory() async {
Directory sdCardDir = await getExternalStorageDirectory();
setState(() {
sdCardPath = sdCardDir.path;
});
} @override
void initState() {
// TODO: implement initState
super.initState(); _requestTempDirectory(); _requestAppDocumentsDirectory(); _requestExternalStorageDirectory();
} @override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('文件用法'),
),
new Row(
children: <Widget>[
new RaisedButton(
textColor: Colors.black, child: new Text('增'), onPressed: _add),
new RaisedButton(
textColor: Colors.black,
child: new Text('删'),
onPressed: _delete),
new RaisedButton(
textColor: Colors.black,
child: new Text('改'),
onPressed: _update),
new RaisedButton(
textColor: Colors.black,
child: new Text('查'),
onPressed: _query),
],
),
new Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: new Text('结果:$_result'),
),
new Text('缓存文件路径:'),
new Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: new Text('$tempPath'),
),
new Text('应用文件路径:'),
new Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: new Text('$appDocPath'),
),
new Text('Android SD卡路径:'),
new Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: new Text('$sdCardPath'),
),
],
);
}
} class LoginWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
var node = new FocusNode();
return new Column(
children: <Widget>[
new TextField(
onChanged: (str) {
username = str;
print(username);
},
decoration: new InputDecoration(
labelText: '用户名',
hintText: '请输入英文或数字',
),
maxLines: 1,
onSubmitted: (text) {
FocusScope.of(context).requestFocus(node);
},
),
new TextField(
onChanged: (text) {
pwd = text;
print(pwd);
},
obscureText: true,
maxLines: 1,
decoration:
new InputDecoration(hintText: '请输入长度大于6的密码', labelText: '密码'),
keyboardType: TextInputType.text,
onSubmitted: (text) {},
),
],
);
}
} class DataPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
body: new DataAppPage(),
);
}
}
效果:
flutter 数据存储 SP和sqlite的更多相关文章
- Flutter 数据存储 加权限 sharedpreference, sqflite, file
要访问SD卡,首先读取权限肯定是要有的,不然写再多代码都是无用功.在AndroidManifest.xml文件中添加 <uses-permission android:name="an ...
- Flutter 数据存储之 shared_preferences
资源名称 网址 github https://github.com/flutter/plugins/tree/master/packages/shared_preferences Flutter 数据 ...
- ios中常见数据存储方式以及SQLite常用的语句
在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults 将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...
- Android 数据存储03之SQLite
SQLite数据存储 Android 集成了 SQLite 数据库.它存储在 /data/data/< 项目文件夹 >/databases/ 下.Android 开发中使用 SQLite ...
- Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider
Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...
- [ Android 五种数据存储方式之三 ] —— SQLite存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...
- Android 之数据存储(sdCard,sharedPreference,sqlite数据库)
sdCard:默认路径在 /storage/sdcard/... Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件. Context提供了如下两个方 ...
- <Android基础> (六) 数据存储 Part 3 SQLite数据库存储
6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...
- 【Android实验】 数据存储与访问sqlite
目录 实验目的 实验要求 实验过程 功能分析: 实验结果: 实验的代码 实验总结 实验目的 分别使用sqlite3工具和Android代码的方式建立SQLite数据库.在完成建立数据库的工作后 ...
随机推荐
- ealsticsearch历史版本下载
ealsticsearch历史版本下载 https://www.elastic.co/cn/downloads/past-releases#elasticsearch
- 开发一个代码的自动生成器,使用Jfinal4.3+Swagger+Sql
-- 所有表名select column_name 列名, data_type 字段类型, column_comment 字段注释 from information_schema.columns ...
- 渗透之路基础 -- XXE注入漏洞
XXE漏洞 XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件, ...
- nginx 配置文件详解(转)
#运行用户 #user nobody; #启动进程,通常设置成和cpu的数量相等或者2倍于cpu的个数(具体结合cpu和内存).默认为1 worker_processes 1; #全局的错误日志和日志 ...
- CentOS7使用阿里yum源安装Docker
yum install -y yum-utils device-mapper-persistent-data lvm2安装所需的包 # yum-config-manager --add-repo ht ...
- GITHUB使用指南、
一.安装Git1.通过官网(https://www.git-scm.com/download/)下载git,进入官网,如下图所示:2.选择对应的操作系统后,页面跳转并自动下载对应的Git版本,如下图所 ...
- c语言中,如果将无符号数转换为有符号数
在使用ti的adc芯片ads1259时,芯片是24为数据格式保存的,其中最高位是符号位,因此可以理解为是有符号数据,但是在嵌入式系统中,没有直接24位的变量,因此使用32的无符号先保存24位的数据. ...
- PCL安装与配置
一.配置环境 1.win7 64位2.Visual Studio 2015 二 .准备工作 安装包准备: 移步:https://www.cnblogs.com/weiyouqing/p/8046387 ...
- httpclient工具使用(org.apache.httpcomponents.httpclient)
httpclient工具使用(org.apache.httpcomponents.httpclient) 引入依赖 <dependency> <groupId>org.apac ...
- Flume拦截器、监控器
一.拦截器 1.拦截器:拦截器主要作用在source和channel之间,用于给event设置header消息头,如果没有设置拦截器,则event中只有message. 常见的拦截器有: Timest ...