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新买的车辆[详细]
-
马桶尿垢是每个家庭都会遇到的问题,它不仅影响卫生,还会影响美观。那么,马桶尿垢太多怎么处理呢?1️⃣ 酸性清洁剂马桶尿垢的主要成分是尿酸结晶,因此使用酸性清洁剂可以有效地去除马桶尿垢。你可以在超市或者卫浴店购买到专门的马桶清洁剂,或者使用白醋、柠檬酸等酸性物质来清洁马桶。2️⃣ 钢丝球如果马桶尿垢太[详细]
-
电脑系统崩溃可能是由以下原因引起:1. 软件冲突:不兼容的软件或驱动程序冲突可能导致系统崩溃。这可能是由于安装了不稳定的或损坏的软件,或者在系统升级后未及时更新软件。2. 病毒或恶意软件感染:恶意软件、病毒或间谍软件的存在可能导致系统崩溃。它们可以破坏系统文件、篡改注册表或影响系统稳定性。3. 操作[详细]
-
联轴器是用来联接不同机构中的两根轴(主动轴和从动轴)使之共同旋转以传递扭矩的机械零件。在高速重载的动力传动中,有些联轴器还有缓冲、减振和提高轴系动态性能的作用。今天着重给大家介绍一下膜片联轴器,其实膜片联轴器是有弹性元件挠性联轴器的一种,本文单独介绍它,说明了此种联轴器的重要性。01 膜片联轴器的组[详细]
-
高低温循环泵是工业中常用的设备,用于循环输送高温或低温的液体介质。在使用过程中,有时会出现机封漏水的情况,这可能导致泵的性能下降、能源浪费以及设备损坏等问题。了解机封漏水的原因对于及时解决问题和保持设备正常运行至关重要。高低温循环泵机封漏水原因机封漏水是指循环泵的机封部位发生泄漏现象,导致泵体和外界[详细]