广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter数据库的使用方法
  • 519
分享到

Flutter数据库的使用方法

2024-04-02 19:04:59 519人浏览 泡泡鱼
摘要

说明 Flutter原生是没有支持数据库操作的,它使用sqllit插件来使应用具有使用数据库的能力。其实就是Flutter通过插件来与原生系统沟通,来进行数据库操作。 平台支持

说明

Flutter原生是没有支持数据库操作的,它使用sqllit插件来使应用具有使用数据库的能力。其实就是Flutter通过插件来与原生系统沟通,来进行数据库操作。

平台支持

  • FLutter的SQLite插件支持iOS,安卓,和MacOS平台
  • 如果要对linux / windows / dartVM进行支持请使用sqflite_common_ffi
  • 不支持WEB平台
  • 数据库操作在安卓或ios的后台执行

使用案例

notepad_sqflite 可以在iOS / Android / Windows / linux / Mac上运行的简单的记事本应用

简单使用

添加依赖

为了使用 SQLite 数据库,首先需要导入 sqflite 和 path 这两个 package

  • sqflite 提供了丰富的类和方法,以便你能便捷实用 SQLite 数据库。
  • path 提供了大量方法,以便你能正确的定义数据库在磁盘上的存储位置。

dependencies:
  sqflite: ^1.3.0
  path:版本号

使用

导入 sqflite.dart


import 'dart:async';

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

打开数据库
SQLite数据库就是文件系统中的文件。如果是相对路径,则该路径是getDatabasesPath()所获得的路径,该路径关联的是Android上的默认数据库目录和iOS上的documents目录。


var db = await openDatabase('my_db.db');

许多时候我们使用数据库时不需要手动关闭它,因为数据库会在程序关闭时被关闭。如果你想自动释放资源,可以使用如下方式:


await db.close();

执行原始的SQL查询

使用getDatabasesPath()获取数据库位置

使用 sqflite package 里的 getDatabasesPath 方法并配合 path package里的 join 方法定义数据库的路径。使用path包中的join方法是确保各个平台路径正确性的最佳实践。


var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');

打开数据库


Database database = await openDatabase(path, version: 1,
    onCreate: (Database db, int version) async {
  // 创建数据库时创建表
  await db.execute(
      'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});

事务中向表中插入几条数据


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');
});

删除表中的一条数据


count = await database
    .rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);

修改表中的数据


int count = await database.rawUpdate('UPDATE Test SET name = ?, value = ? WHERE name = ?',
    ['updated name', '9876', 'some name']);
print('updated: $count');

查询表中的数据


// Get the records
List<Map> list = await database.rawQuery('SELECT * FROM Test');
List<Map> expectedList = [
  {'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789},
  {'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416}
];
print(list);
print(expectedList);

查询表中存储数据的总条数


count = Sqflite.firstIntValue(await database.rawQuery('SELECT COUNT(*) FROM Test'));

关闭数据库


await database.close();

删除数据库


await deleteDatabase(path);

使用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,以供外部使用
  Map<String, Object?> toMap() {
    var map = <String, Object?>{
      columnTitle: title,
      columnDone: done == true ? 1 : 0
    };
    if (id != null) {
      map[columnId] = id;
    }
    return map;
  }
  //无参构造
  Todo();
  
  //把map类型的数据转换成当前类对象的构造函数。
  Todo.fromMap(Map<String, Object?> 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<Todo> insert(Todo todo) async {
    todo.id = await db.insert(tableTodo, todo.toMap(),conflictAlGorithm: ConflictAlgorithm.replace,);
    return todo;
  }

  Future<Todo> getTodo(int id) async {
    List<Map> maps = await db.query(tableTodo,
        columns: [columnId, columnDone, columnTitle],
        where: '$columnId = ?',
        whereArgs: [id]);
    if (maps.length > 0) {
      return Todo.fromMap(maps.first);
    }
    return null;
  }

  Future<int> delete(int id) async {
    return await db.delete(tableTodo, where: '$columnId = ?', whereArgs: [id]);
  }

  Future<int> update(Todo todo) async {
    return await db.update(tableTodo, todo.toMap(),
        where: '$columnId = ?', whereArgs: [todo.id]);
  }

  Future close() async => db.close();
}

=查询表中的所有数据


List<Map<String, Object?>> records = await db.query('my_table');

获取结果中的第一条数据


Map<String, Object?> mapRead = records.first;

上面查询结果的列表中Map为只读数据,修改此数据会抛出异常


mapRead['my_column'] = 1;
// Crash... `mapRead` is read-only

创建map副本并修改其中的字段


// 根据上面的map创建一个map副本
Map<String, Object?> map = Map<String, Object?>.from(mapRead);
// 在内存中修改此副本中存储的字段值
map['my_column'] = 1;

把查询出来的List< map>类型的数据转换成List< Todo>类型,这样我们就可以痛快的使用啦。


// Convert the List<Map<String, dynamic> into a List<Todo>.
  return List.generate(maps.length, (i) {
    return Todo(
      id: maps[i][columnId],
      title: maps[i][columnTitle],
      done: maps[i][columnDown],
    );
  });

批处理

您可以使用批处理来避免dart与原生之间频繁的交互。


batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();

获取每个操作的结果是需要成本的(插入的Id以及更新和删除的更改数)。如果您不关心操作的结果则可以执行如下操作关闭结果的响应


await batch.commit(noResult: true);

事务中使用批处理

在事务中进行批处理操作,当事务提交后才会提交批处理。


await database.transaction((txn) async {
  var batch = txn.batch();
  
  // ...
  
  // commit but the actual commit will happen when the transaction is committed
  // however the data is available in this transaction
  await batch.commit();
  
  //  ...
});

批处理异常忽略

默认情况下批处理中一旦出现错误就会停止(未执行的语句则不会被执行了),你可以忽略错误,以便后续操作的继续执行。


await batch.commit(continueOnError: true);

关于表名和列名

通常情况下我们应该避免使用SQLite关键字来命名表名称和列名称。如:

"add","all","alter","and","as","autoincrement","between","case","check","collate",
"commit","constraint","create","default","deferrable","delete","distinct","drop",
"else","escape","except","exists","foreign","from","group","having","if","in","index",
"insert","intersect","into","is","isnull","join","limit","not","notnull","null","on",
"or","order","primary","references","select","set","table","then","to","transaction",
"uNIOn","unique","update","using","values","when","where"

支持的存储类型

  • 由于尚未对值进行有效性检查,因此请避免使用不受支持的类型。参见:
  • 不支持DateTime类型,可将它存储为int或String
  • 不支持bool类型,可存储为int类型 0:false,1:true

SQLite类型 dart类型 值范围
integer int 从-2 ^ 63到2 ^ 63-1
real num
text String
blob Uint8List

参考

sqflile官方地址
flutter对使用SQLite进行数据存储官方介绍文档

到此这篇关于Flutter数据库的使用方法的文章就介绍到这了,更多相关Flutter数据库使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网! 

--结束END--

本文标题: Flutter数据库的使用方法

本文链接: https://www.lsjlt.com/news/125373.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter数据库的使用方法
    说明 Flutter原生是没有支持数据库操作的,它使用SQLlit插件来使应用具有使用数据库的能力。其实就是Flutter通过插件来与原生系统沟通,来进行数据库操作。 平台支持 ...
    99+
    2022-11-12
  • Flutter中的数据库怎么使用
    这篇文章主要讲解了“Flutter中的数据库怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter中的数据库怎么使用”吧!在Flutter开发过程中,我门有时候需要对一些数据进...
    99+
    2023-06-30
  • flutter操作excel表的库使用方法
    推荐库 spreadsheet_decoderexcel 方案一:spreadsheet_decoder 加入依赖 dependencies: flutter: sdk: flutter spreadsheet_decoder: ...
    99+
    2023-08-17
    flutter excel
  • Flutter中的Firebase:如何使用Flutter连接Firebase数据库
    作者:禅与计算机程序设计艺术 Flutter中的Firebase:如何使用Flutter连接Firebase数据库 作为一名人工智能专家,程序员和软件架构师,我经常会被Flutter的技术魅力所吸引...
    99+
    2023-10-05
    自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
  • MongoDB数据库的使用方法
    这篇文章主要介绍“MongoDB数据库的使用方法”,在日常操作中,相信很多人在MongoDB数据库的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MongoDB数据库...
    99+
    2022-10-18
  • 使用mysql数据库的方法
    小编给大家分享一下使用mysql数据库的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、MySQL服务器的启动与关闭1、启...
    99+
    2022-10-18
  • Flutter中数据库的使用教程详解
    在Flutter开发过程中,我门有时候需要对一些数据进行本地的持久化存储,使用sp文件形式虽然也能解决问题,但是有时数据量较大的时候,显然我们文件形式就不太合适了,这时候我们就需要使...
    99+
    2022-11-13
  • Flutter使用sqflite处理数据表变更的方法详解
    目录前言sqflite 版本管理备忘录实例 - 增加标签运行效果总结前言 上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了...
    99+
    2023-05-14
    Flutter sqflite处理数据表变更 Flutter sqflite数据表变更 Flutter sqflite数据表 Flutter sqflite
  • MySQL数据库mysqlcheck的使用方法
    这篇文章主要介绍了MySQL数据库mysqlcheck的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  MySQL数据库mysql...
    99+
    2022-10-18
  • ASP使用MySQL数据库的方法
    本篇内容介绍了“ASP使用MySQL数据库的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MYSQL数据库以它短小、方便、速度快、免费等...
    99+
    2023-06-17
  • Flutter网络请求Dio库的使用及封装方法
    这篇文章主要讲解了“Flutter网络请求Dio库的使用及封装方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter网络请求Dio库的使用及封装方法”吧!Dart语言内置的Http...
    99+
    2023-06-30
  • mysql数据库的substr函数的使用方法
    这篇文章给大家分享的是有关mysql数据库的substr函数的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。数据库的substr函数用法:1、【SUBSTR(st...
    99+
    2022-10-18
  • Flutter的键值存储数据库使用示例详解
    目录Flutter 键值存储数据库unqliteunqlite_flutter快速上手简单键值对存储JSON为什么你应该使用unqlite_flutter?Flutter 键值存储数...
    99+
    2022-11-13
    Flutter键值存储数据库 Flutter键值存储
  • 数据库中触发器的使用方法
    本篇文章给大家分享的是有关数据库中触发器的使用方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建数据库触发器的语法是:【CREATE &l...
    99+
    2022-10-18
  • mysql数据库中having的使用方法
    这期内容当中小编将会给大家带来有关mysql数据库中having的使用方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。having字句可以让我们筛选成组后的各种数...
    99+
    2022-10-18
  • SQL Server数据库default value的使用方法
    这篇文章将为大家详细讲解有关SQL Server数据库default value的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  SQLServer数据库def...
    99+
    2022-10-18
  • 使用phpmyadmin导出sql数据库的方法
    这篇文章将为大家详细讲解有关使用phpmyadmin导出sql数据库的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。phpmyadmin导出sql数据库的步骤:输入h...
    99+
    2022-10-18
  • SQLServer2005数据库游标调用函数的使用方法
    这篇文章主要讲解了“SQLServer2005数据库游标调用函数的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQLServer2005数据库游标...
    99+
    2022-10-18
  • Python操作使用MySQL数据库方法
    下面一起来了解下Python操作使用MySQL数据库方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Python操作使用MySQL数据库方法这篇短内容是你想要的。一,安装mysql 如果是w...
    99+
    2022-10-18
  • 教你使用MySQLShell连接数据库的方法
    目录一、下载MySQL Shell二、配置运行环境三、连接MySQL数据库在有些情况下我们需要使用命令行方式连接MySQL数据库,这时可以使用MySQL官方提供的命令行工具MySQL...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作