flutter 本地存储和 Android中的数据库中是怎样实现的
时间:2024-02-17 06:39:32 编辑:勤于奋老勤
如何使用 Shared Preferences?
在 Android 中,你可以使用 SharedPreferences API 来存储少量的键值对。
在 Flutter 中,使用 Shared_Preferences 插件 实现此功能。这个插件同时包装了 Shared Preferences 和 NSUserDefaults(iOS 平台对应 API)的功能。
用法
要使用此插件,请在pubspec.yaml文件中添加shared_preferences为依赖项。
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { runApp(MaterialApp( home: Scaffold( body: Center( child: RaisedButton( onPressed: _incrementCounter, child: Text('Increment Counter'), ), ), ), )); } _incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); int counter = (prefs.getInt('counter') ?? 0) + 1; print('Pressed $counter times.'); await prefs.setInt('counter', counter); }
测试
您可以SharedPreferences通过运行以下代码在测试中填充初始值:
const MethodChannel('plugins.flutter.io/shared_preferences') .setMockMethodCallHandler((MethodCall methodCall) async { if (methodCall.method == 'getAll') { return {}; // set initial values here if desired } return null; });
在 Flutter 中如何使用 SQLite?
在 Android 中,你会使用 SQLite 来存储可以通过 SQL 进行查询的结构化数据。
在 Flutter 中,使用 SQFlite 插件实现此功能。
Flutter的 SQLite插件。同时支持iOS和Android。
- 支持交易和批次
- 打开期间自动版本管理
- 插入/查询/更新/删除查询的助手
- 在iOS和Android的后台线程中执行的数据库操作
入门
在flutter项目中添加依赖项:
dependencies: ... sqflite: ^1.1.7+1
用法示例
进口 sqflite.dart
打开数据库
SQLite数据库是文件系统中由路径标识的文件。如果是相对路径,则该路径相对于所获得的路径,该路径是getDatabasesPath()Android上的默认数据库目录和iOS上的documents目录。
var db = await openDatabase('my_db.db');
有一个基本的迁移机制可以处理打开期间的模式更改。
许多应用程序使用一个数据库,并且永远不需要关闭它(当应用程序终止时,它将关闭)。如果要释放资源,可以关闭数据库。
await db.close();
原始的SQL查询
演示代码执行原始SQL查询
// Get a location using getDatabasesPath var databasesPath = await getDatabasesPath(); String path = join(databasesPath, 'demo.db'); // Delete the database await deleteDatabase(path); // open the database 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)'); }); // Insert some records in a transaction 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'); }); // Update some record int count = await database.rawUpdate( 'UPDATE Test SET name = ?, VALUE = ? WHERE name = ?', ['updated name', '9876', 'some name']); print('updated: $count'); // Get the records List
SQL助手
使用助手的示例
final String tableTodo = 'todo'; final String columnId = '_id'; final String columnTitle = 'title'; final String columnDone = 'done'; class Todo { int id; String title; bool done; Map toMap() { var map = { columnTitle: title, columnDone: done == true ? 1 : 0 }; if (id != null) { map[columnId] = id; } return map; } Todo(); Todo.fromMap(Map map) { id = map[columnId]; title = map[columnTitle]; done = map[columnDone] == 1; } } class TodoProvider { Database db; Future open(String path) async { db = await openDatabase(path, version: 1, onCreate: (Database db, int version) async { await db.execute(''' create table $tableTodo ( $columnId integer primary key autoincrement, $columnTitle text not null, $columnDone integer not null) '''); }); } Future insert(Todo todo) async { todo.id = await db.insert(tableTodo, todo.toMap()); return todo; } Future getTodo(int id) async { Listmaps = await db.query(tableTodo, columns: [columnId, columnDone, columnTitle], where: '$columnId = ?', whereArgs: [id]); if (maps.length > 0) { return Todo.fromMap(maps.first); } return null; } Future delete(int id) async { return await db.delete(tableTodo, where: '$columnId = ?', whereArgs: [id]); } Future update(Todo todo) async { return await db.update(tableTodo, todo.toMap(), where: '$columnId = ?', whereArgs: [todo.id]); } Future close() async => db.close(); }
读取结果
假设有以下读取结果:
生成的地图项为只读
// get the first record Map mapRead = records.first; // Update it in memory...this will throw an exception mapRead['my_column'] = 1; // Crash... `mapRead` is read-only
如果要在内存中进行修改,则需要创建一个新地图:
// get the first record Map map = Map.from(mapRead); // Update it in memory now map['my_column'] = 1;
相关文章
-
曾经的我,一人独自在陌生的城市工作,好在是双休,躲在自己的出租屋里,看书学习打游戏,好不安逸,唯一的遗憾就是吃不好,小区门口的小饭馆都吃遍了,始终不尽人意,人在异乡,饮食和口味适应,还是一件非常头疼的事情,时间一长,我就萌生了在家自己下厨房做饭的想法;简单采购了锅碗瓢盆之后,就开始去图书馆购买了几本[详细]
-
1、韭菜又叫起阳草,味道非常鲜美,还有独特的香味。2、 今天就来分享一下“韭菜盒子”做法,喜欢的朋友可以先收藏,有空自己试一下。3、下面开始介绍所需要的食材:韭菜、面粉、粉丝、鸡蛋、食盐、水淀粉、老抽、白醋、味精、蚝油4、韭菜放入盆中用清水清洗干净,再放到流水底下彻底冲洗干净,然后沥干水分。大盆中放[详细]
-
铜钱草除了可以土培,还可以水养,它的生长速度相当快,水培时只需用一根铜钱草就能长出一整盆。不过用来水培的铜钱草一定要是健康无病的。下面详细介绍一下铜钱根茎的水培过程。1.插穗挑选铜钱草水培时生长速度很快,可以在母株里选择一根长势良好的根茎,单独剪出来,不用担心一根会水培不成功,只要适应了新环境,很快[详细]
-
孩子的成长发育往往是我们作为家长最为关心的事,但是现在许多孩子都十分的挑食,导致他们的营养跟不上,这可让我们作为家长的操碎了心,但是大家别担心,最近小编发现了一道菜品,十分的适合孩子吃,还特别 的有营养。海带和“它”是绝配,不腥不腻补钙好吸收,牛奶大骨头都要靠边站。“它”是什么呢?它就是排骨。排骨的[详细]
-
括括 kuò(guā):左右结构,左收右展。左部“扌”旁斜势抗肩,左伸右收,不要写宽。横画露锋起笔,大扛肩,勿长;竖钩起笔稍重,向下略左斜,从短横右部穿过,中间略细,略弯,劲挺有力,到位后跪笔弹锋出钩,钩不可大;提笔起笔左探,切笔后向右上方提笔出锋,过竖笔即止。右部“舌”字不要写宽,平稳端庄。平撇起[详细]