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;
相关文章
-
巧克力酱是一款美味甜品,主要原料有可可粉、牛奶等,既可以作为一种甜品食用也可以作为面包等调味酱来使用。一款巧克力酱的用途非常广泛,许多巧克力面包面团、甜品、蛋糕抹面、慕斯淋面、甜品装饰、吐司抹酱等等,都会用到他。做法也很简单。原料:可可粉、牛奶75ml、白糖。首先,把牛奶倒入锅里,煮沸时放入两大勺可[详细]
-
很多人在买电脑时,面对计算机的性能不知道该如何选择,是选择i5还是i7? 酷睿i5处理器是英特尔的一款产品,同样建基于intel nehalem微架构。与core i7支持三通道存储器不同,core i5只会集成双通道DDR3存储器控制器。另外,core i5会集成一些北桥的功能,将集成Pci-e[详细]
-
说起蒜苗做的美食,很多人第一个想到的菜肴就是四川的“回锅肉”,蒜苗浓烈的香味完美地遮盖了猪肉油腻的缺点。因为冬季土壤含水量低的原因,使得蒜苗的香味达到最高,另外因为这个时候蒜苗刚出苗不久,所以吃起来也很嫩。今天小帅就分享几道用蒜苗做的家常菜,干饭人别错过了。《蒜苗回锅肉》食材:猪臀肉,青蒜苗,豆瓣酱[详细]
-
在家就可以做的哈根达斯,比外面买的还好吃。无需冰淇淋机,只要有冰箱就可以。奶香味浓郁无冰渣,加入蔓越莓也太赞。食材:可生食鸡蛋4个淡奶油200克炼乳120克细砂糖30克蔓越莓干适量做法:1准备好所需材料;2做蛋糕一样把蛋白和蛋黄分离,容器保持无油无水;3糖分三次加入打发到这种硬性发泡后备用;4淡奶油[详细]
-
土豆作为一种优质的食材,是我们百姓餐桌上的一道家常菜,可炖,可炒,可凉拌,各式各样的做法,无论怎么做都好吃。土豆含有大量淀粉和各种营养物质,能为人体提供丰富的热量,且富含蛋白质、氨基酸及多种维生素、矿物质,尤其是其维生素含量是所有粮食作物中最全的。很多地方都把它当成主粮来食用。土豆一年四季都热销,因[详细]