添加插件:

  1. shared_preferences: ^0.4.2
  2. path_provider: ^1.2.0
  3. sqflite: ^0.12.0
  1. import 'dart:async';
  2. import 'dart:io';
  3.  
  4. import 'package:flutter/material.dart';
  5. import 'package:path/path.dart';
  6. import 'package:path_provider/path_provider.dart';
  7. import 'package:shared_preferences/shared_preferences.dart';
  8. import 'package:sqflite/sqflite.dart';
  9.  
  10. String username = '';
  11.  
  12. String pwd = '';
  13.  
  14. const String USERNAME = 'username';
  15.  
  16. const String PWD = 'pwd';
  17.  
  18. class DataAppPage extends StatefulWidget {
  19. @override
  20. State<StatefulWidget> createState() {
  21. // TODO: implement createState
  22. return new _DataAppPageState();
  23. }
  24. }
  25.  
  26. class _DataAppPageState extends State<DataAppPage> {
  27. @override
  28. Widget build(BuildContext context) {
  29. // TODO: implement build
  30. return new Scaffold(
  31. appBar: new AppBar(
  32. title: new Text('数据存储 学习'),
  33. centerTitle: true,
  34. ),
  35. body: new ListView(
  36. children: <Widget>[
  37. new Padding(
  38. padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
  39. child: new Text('对用户名和密码进行增删改查的操作'),
  40. ),
  41. new Padding(
  42. padding: const EdgeInsets.only(left: 10.0, right: 10.0),
  43. child: new LoginWidget(),
  44. ),
  45. new Padding(
  46. padding: const EdgeInsets.only(
  47. top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
  48. child: new HandleSPDataWidget(),
  49. ),
  50. new Padding(
  51. padding: const EdgeInsets.only(
  52. top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
  53. child: new HandleSQLiteDataWidget(),
  54. ),
  55. new Padding(
  56. padding: const EdgeInsets.only(
  57. top: 10.0, left: 10.0, bottom: 10.0, right: 10.0),
  58. child: new HandleFileDataWidget(),
  59. ),
  60. ],
  61. ),
  62. );
  63. }
  64. }
  65.  
  66. class HandleSPDataWidget extends StatefulWidget {
  67. @override
  68. State<StatefulWidget> createState() {
  69. return new _HandleSPDataWidgetState();
  70. }
  71. }
  72.  
  73. class _HandleSPDataWidgetState extends State<HandleSPDataWidget> {
  74. var _result;
  75.  
  76. _add() async {
  77. SharedPreferences prefs = await SharedPreferences.getInstance();
  78.  
  79. prefs.setString(USERNAME, username);
  80.  
  81. prefs.setString(PWD, pwd);
  82.  
  83. setState(() {
  84. _result = '_add 成功 请点击查验证结果';
  85. });
  86. }
  87.  
  88. _delete() async {
  89. SharedPreferences prefs = await SharedPreferences.getInstance();
  90.  
  91. //KEY
  92. prefs.remove(USERNAME);
  93. prefs.remove(PWD);
  94.  
  95. //清空所有KEY
  96. //prefs.clear();
  97.  
  98. setState(() {
  99. _result = '_delete 成功, 请点击查验证结果';
  100. });
  101. }
  102.  
  103. _update() async {
  104. SharedPreferences prefs = await SharedPreferences.getInstance();
  105.  
  106. prefs.setString(USERNAME, 'Paul');
  107.  
  108. prefs.setString(PWD, '654321');
  109.  
  110. setState(() {
  111. _result = '_update 成功,用户名修改为Paul,密码修改为654321, 请点击查验证结果';
  112. });
  113. }
  114.  
  115. _query() async {
  116. SharedPreferences prefs = await SharedPreferences.getInstance();
  117.  
  118. String username = prefs.get(USERNAME);
  119.  
  120. String pwd = prefs.get(PWD);
  121.  
  122. print('$username');
  123.  
  124. print('$pwd');
  125.  
  126. setState(() {
  127. _result = '_query 成功: username: $username pwd: $pwd';
  128. });
  129. }
  130.  
  131. @override
  132. Widget build(BuildContext context) {
  133. // TODO: implement build
  134.  
  135. return new Column(
  136. children: <Widget>[
  137. new Padding(
  138. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  139. child: new Text('shared_preferences用法'),
  140. ),
  141.  
  142. new Row(
  143. children: <Widget>[
  144. new RaisedButton(
  145. textColor: Colors.black,
  146. child: new Text('增'),
  147. onPressed: _add
  148. ),
  149. new RaisedButton(
  150. textColor: Colors.black,
  151. child: new Text('删'),
  152. onPressed: _delete),
  153. new RaisedButton(
  154. textColor: Colors.black,
  155. child: new Text('改'),
  156. onPressed: _update),
  157. new RaisedButton(
  158. textColor: Colors.black,
  159. child: new Text('查'),
  160. onPressed: _query),
  161. ],),
  162. new Padding(
  163. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  164. child: new Text('结果:$_result'),
  165. ),
  166. ],
  167. );
  168. }
  169. }
  170.  
  171. class HandleSQLiteDataWidget extends StatefulWidget {
  172. @override
  173. State<StatefulWidget> createState() {
  174. return new _HandleSQLiteDataWidgetState();
  175. }
  176. }
  177.  
  178. class _HandleSQLiteDataWidgetState extends State<HandleSQLiteDataWidget> {
  179. // TODO: implement build
  180.  
  181. String dbName = 'user.db';
  182. String dbPath;
  183.  
  184. String sql_createTable =
  185. 'CREATE TABLE user_table (id INTEGER PRIMARY KEY, username TEXT,pwd Text)';
  186.  
  187. String sql_query_count = 'SELECT COUNT(*) FROM user_table';
  188.  
  189. String sql_query = 'SELECT * FROM user_table';
  190.  
  191. var _result;
  192.  
  193. Future<String> _createNewDb(String dbName) async {
  194. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  195. print(documentsDirectory);
  196.  
  197. String path = join(documentsDirectory.path, dbName);
  198.  
  199. if (await new Directory(dirname(path)).exists()) {
  200. await deleteDatabase(path);
  201. } else {
  202. try {
  203. await new Directory(dirname(path)).create(recursive: true);
  204. } catch (e) {
  205. print(e);
  206. }
  207. }
  208. return path;
  209. }
  210.  
  211. _create() async {
  212. dbPath = await _createNewDb(dbName);
  213. Database db = await openDatabase(dbPath);
  214.  
  215. await db.execute(sql_createTable);
  216. await db.close();
  217. setState(() {
  218. _result = '创建user.db成功,创建user_table成功';
  219. });
  220. }
  221.  
  222. _add() async {
  223.  
  224. Database db = await openDatabase(dbPath);
  225.  
  226. String sql =
  227. "INSERT INTO user_table(username,pwd) VALUES('$username','$pwd')";
  228. await db.transaction((txn) async {
  229. int id = await txn.rawInsert(sql);
  230. });
  231.  
  232. await db.close();
  233.  
  234. setState(() {
  235. _result = "插入username=$username,pwd=$pwd数据成功";
  236. });
  237. }
  238.  
  239. _delete() async {
  240. Database db = await openDatabase(dbPath);
  241.  
  242. String sql = "DELETE FROM user_table WHERE id = ?";
  243.  
  244. int count = await db.rawDelete(sql, ['1']);
  245.  
  246. await db.close();
  247.  
  248. setState(() {
  249. if (count == 1) {
  250. _result = "删除成功,请查看";
  251. } else {
  252. _result = "删除失败,请看log";
  253. }
  254. });
  255. }
  256.  
  257. _update() async {
  258. Database db = await openDatabase(dbPath);
  259. String sql = "UPDATE user_table SET pwd = ? WHERE id = ?";
  260. int count = await db.rawUpdate(sql, ["654321", '1']);
  261. print(count);
  262. await db.close();
  263. setState(() {
  264. _result = "更新数据成功,请查看";
  265. });
  266. }
  267.  
  268. _queryNum() async {
  269. Database db = await openDatabase(dbPath);
  270. int count = Sqflite.firstIntValue(await db.rawQuery(sql_query_count));
  271. await db.close();
  272. setState(() {
  273. _result = "数据条数:$count";
  274. });
  275. }
  276.  
  277. _query() async {
  278. Database db = await openDatabase(dbPath);
  279. List<Map> list = await db.rawQuery(sql_query);
  280. await db.close();
  281. setState(() {
  282. _result = "数据详情:$list";
  283. });
  284. }
  285.  
  286. @override
  287. Widget build(BuildContext context) {
  288. return new Column(
  289. children: <Widget>[
  290. new Padding(
  291. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  292. child: new Text('sqflite用法'),
  293. ),
  294. new Row(
  295. children: <Widget>[
  296. new RaisedButton(
  297. textColor: Colors.black,
  298. child: new Text('创建'),
  299. onPressed: _create),
  300. new RaisedButton(
  301. textColor: Colors.black, child: new Text('增'), onPressed: _add),
  302. new RaisedButton(
  303. textColor: Colors.black,
  304. child: new Text('删'),
  305. onPressed: _delete),
  306. new RaisedButton(
  307. textColor: Colors.black,
  308. child: new Text('改'),
  309. onPressed: _update),
  310. ],
  311. ),
  312. new Row(
  313. children: <Widget>[
  314. new RaisedButton(
  315. textColor: Colors.black,
  316. child: new Text('查条数'),
  317. onPressed: _queryNum),
  318. new RaisedButton(
  319. textColor: Colors.black,
  320. child: new Text('查详情'),
  321. onPressed: _query),
  322. ],
  323. ),
  324. new Padding(
  325. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  326. child: new Text('结果:$_result'),
  327. ),
  328. ],
  329. );
  330. }
  331. }
  332.  
  333. class HandleFileDataWidget extends StatefulWidget {
  334. @override
  335. State<StatefulWidget> createState() {
  336. return new _HandleFileDataWidgetState();
  337. }
  338. }
  339.  
  340. class _HandleFileDataWidgetState extends State<HandleFileDataWidget> {
  341. // TODO: implement build
  342.  
  343. String tempPath;
  344.  
  345. String appDocPath;
  346.  
  347. String sdCardPath;
  348.  
  349. var _result;
  350.  
  351. _add() async {
  352.  
  353. File file = new File('$tempPath/user.txt');
  354. await file.writeAsString('用户名:$username\n密码:$pwd');
  355. setState(() {
  356. _result = '写入成功,请查询';
  357. });
  358. }
  359.  
  360. _delete() {
  361. File file = new File('$tempPath/user.txt');
  362. file.deleteSync(recursive: false);
  363. setState(() {
  364. _result = '删除成功,请查看';
  365. });
  366. }
  367.  
  368. _update() async {
  369. File file = new File('$tempPath/user.txt');
  370. await file.writeAsString('用户名:Paul\n密码:654321');
  371. setState(() {
  372. _result = '修改成功,请查询';
  373. });
  374. }
  375.  
  376. _query() async {
  377. try {
  378. File file = new File('$tempPath/user.txt');
  379. _result = '查询成功\n' + await file.readAsString();
  380. } on Exception catch (e) {
  381. _result = ' exception: $e';
  382. }
  383.  
  384. setState(() {});
  385. }
  386.  
  387. void _requestTempDirectory() async {
  388. Directory tempDir = await getTemporaryDirectory();
  389. setState(() {
  390. tempPath = tempDir.path;
  391. });
  392. }
  393.  
  394. void _requestAppDocumentsDirectory() async {
  395. Directory appDocDir = await getApplicationDocumentsDirectory();
  396. setState(() {
  397. appDocPath = appDocDir.path;
  398. });
  399. }
  400.  
  401. void _requestExternalStorageDirectory() async {
  402. Directory sdCardDir = await getExternalStorageDirectory();
  403. setState(() {
  404. sdCardPath = sdCardDir.path;
  405. });
  406. }
  407.  
  408. @override
  409. void initState() {
  410. // TODO: implement initState
  411. super.initState();
  412.  
  413. _requestTempDirectory();
  414.  
  415. _requestAppDocumentsDirectory();
  416.  
  417. _requestExternalStorageDirectory();
  418. }
  419.  
  420. @override
  421. Widget build(BuildContext context) {
  422. return new Column(
  423. children: <Widget>[
  424. new Padding(
  425. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  426. child: new Text('文件用法'),
  427. ),
  428. new Row(
  429. children: <Widget>[
  430. new RaisedButton(
  431. textColor: Colors.black, child: new Text('增'), onPressed: _add),
  432. new RaisedButton(
  433. textColor: Colors.black,
  434. child: new Text('删'),
  435. onPressed: _delete),
  436. new RaisedButton(
  437. textColor: Colors.black,
  438. child: new Text('改'),
  439. onPressed: _update),
  440. new RaisedButton(
  441. textColor: Colors.black,
  442. child: new Text('查'),
  443. onPressed: _query),
  444. ],
  445. ),
  446. new Padding(
  447. padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
  448. child: new Text('结果:$_result'),
  449. ),
  450. new Text('缓存文件路径:'),
  451. new Padding(
  452. padding: const EdgeInsets.only(bottom: 10.0),
  453. child: new Text('$tempPath'),
  454. ),
  455. new Text('应用文件路径:'),
  456. new Padding(
  457. padding: const EdgeInsets.only(bottom: 10.0),
  458. child: new Text('$appDocPath'),
  459. ),
  460. new Text('Android SD卡路径:'),
  461. new Padding(
  462. padding: const EdgeInsets.only(bottom: 10.0),
  463. child: new Text('$sdCardPath'),
  464. ),
  465. ],
  466. );
  467. }
  468. }
  469.  
  470. class LoginWidget extends StatelessWidget {
  471. @override
  472. Widget build(BuildContext context) {
  473. var node = new FocusNode();
  474. return new Column(
  475. children: <Widget>[
  476. new TextField(
  477. onChanged: (str) {
  478. username = str;
  479. print(username);
  480. },
  481. decoration: new InputDecoration(
  482. labelText: '用户名',
  483. hintText: '请输入英文或数字',
  484. ),
  485. maxLines: 1,
  486. onSubmitted: (text) {
  487. FocusScope.of(context).requestFocus(node);
  488. },
  489. ),
  490. new TextField(
  491. onChanged: (text) {
  492. pwd = text;
  493. print(pwd);
  494. },
  495. obscureText: true,
  496. maxLines: 1,
  497. decoration:
  498. new InputDecoration(hintText: '请输入长度大于6的密码', labelText: '密码'),
  499. keyboardType: TextInputType.text,
  500. onSubmitted: (text) {},
  501. ),
  502. ],
  503. );
  504. }
  505. }
  506.  
  507. class DataPage extends StatelessWidget {
  508. @override
  509. Widget build(BuildContext context) {
  510. // TODO: implement build
  511. return new Scaffold(
  512. body: new DataAppPage(),
  513. );
  514. }
  515. }

效果:

flutter 数据存储 SP和sqlite的更多相关文章

  1. Flutter 数据存储 加权限 sharedpreference, sqflite, file

    要访问SD卡,首先读取权限肯定是要有的,不然写再多代码都是无用功.在AndroidManifest.xml文件中添加 <uses-permission android:name="an ...

  2. Flutter 数据存储之 shared_preferences

    资源名称 网址 github https://github.com/flutter/plugins/tree/master/packages/shared_preferences Flutter 数据 ...

  3. ios中常见数据存储方式以及SQLite常用的语句

    在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults  将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...

  4. Android 数据存储03之SQLite

    SQLite数据存储 Android 集成了 SQLite 数据库.它存储在 /data/data/< 项目文件夹 >/databases/ 下.Android 开发中使用 SQLite ...

  5. Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider

    Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...

  6. [ Android 五种数据存储方式之三 ] —— SQLite存储数据

    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...

  7. Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

    sdCard:默认路径在 /storage/sdcard/... Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件. Context提供了如下两个方 ...

  8. <Android基础> (六) 数据存储 Part 3 SQLite数据库存储

    6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...

  9. 【Android实验】 数据存储与访问sqlite

    目录 实验目的 实验要求 实验过程 功能分析: 实验结果: 实验的代码 实验总结 实验目的     分别使用sqlite3工具和Android代码的方式建立SQLite数据库.在完成建立数据库的工作后 ...

随机推荐

  1. 文本编辑器Vim/Neovim任意代码执行漏洞(CVE-2019-12735)

    受影响版本: Vim < 8.1.1365, Neovim < 0.3.6 前提:开启modeline 0x01 开启modeline 在你的home下的.vimrc文件中增加一行: se ...

  2. pdftk - handy tool for manipulating PDF 免费的pdf合并工具

    Linux pdf合并的工具 安装工具 $ sudo apt-get install pdftk 使用 $ pdftk *.pdf cat output all-in-one.pdf &&am ...

  3. windows 10 下部署WCF 一些细节

    总体上在IIS中部署一个WCF服务和Win7没有什么区别 但是,如果你使用的是.NET 4.5开发的 WCF服务,而windows10 又安装了.net 4.7 那么你需要注意下面问题

  4. MyBatis_tp50_动态sql_sql标签_抽取可重用的sql片段_使用include标签进行引用

    笔记要点出错分析与总结 include内部使用自定的属性,之能使用$ {}来取值 ,#{}不能用 工程组织数据库组织0.重新修改Bean类1.定义接口 public interface Employe ...

  5. HDFS中DataNode的心跳机制

    DataNode心跳机制的作用讲解了DataNode的三个作用: register:当DataNode启动的时候,DataNode需要将自身的一些信息(hostname, version等)告诉Nam ...

  6. linux第一天命令

    命令 :   命令 [选项] [参数]   /;根目录 用户主目录:/home/用户名   <==>  ~   1.ls 显示路径中的内容   ls [参数] [路径] ls ls -l  ...

  7. Tensorflow细节-P62-完整的神经网络样例程序

    这样是比较好的一个summary命名 (1)'networks'.'layer_%d' % n_layer.'weights'三个命名空间相互叠加 (2) if i % 50 == 0: result ...

  8. YAML_15 include and roles

    在编写playbook的时候随着项目越来越大,playbook越来越复杂.可以把一些play.task 或 handler放到其他文件中,通过包含进来是一个不错的选择. roles像是加强版的incl ...

  9. 数据库访问优化之四:减少数据库服务器CPU运算

    1.使用绑定变量 绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值. 非绑定变量写法:Select * from employee where id=123456 ...

  10. Linux下搭建iSCSI共享存储的方法 Linux-IO Target 方式 Debian9.5下实现

    iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速 ...