如何在 Flutter 中使用 SQFlite 进行数据库插入

2023-11-22

如何使用 SQFlite 插件将数据插入 Flutter 数据库?

有很多解决问题的问题,但我找不到一个可以添加规范答案的问题。我的回答如下。


添加依赖项

Open pubspec.yaml并在依赖项部分添加以下行:

sqflite: ^1.0.0
path_provider: ^0.4.1

The sqflite is the SQFlite当然还有插件path_provider将帮助我们获取Android和iPhone上的用户目录。

制作一个数据库辅助类

我在单例类中保留对数据库的全局引用。这将防止并发问题和数据泄漏(这是我听到的,但请告诉我我是否错了)。您还可以在此处添加辅助方法(如插入)来访问数据库。

创建一个名为的新文件数据库助手.dart并粘贴以下代码:

import 'dart:io' show Directory;
import 'package:path/path.dart' show join;
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart' show getApplicationDocumentsDirectory;

class DatabaseHelper {

  static final _databaseName = "MyDatabase.db";
  static final _databaseVersion = 1;

  static final table = 'my_table';

  static final columnId = '_id';
  static final columnName = 'name';
  static final columnAge = 'age';

  // make this a singleton class
  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  // only have a single app-wide reference to the database
  static Database _database;
  Future<Database> get database async {
    if (_database != null) return _database;
    // lazily instantiate the db the first time it is accessed
    _database = await _initDatabase();
    return _database;
  }

  // this opens the database (and creates it if it doesn't exist)
  _initDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, _databaseName);
    return await openDatabase(path,
        version: _databaseVersion,
        onCreate: _onCreate);
  }

  // SQL code to create the database table
  Future _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY,
            $columnName TEXT NOT NULL,
            $columnAge INTEGER NOT NULL
          )
          ''');
  }
}

插入数据

我们将使用异步方法来执行插入:

  _insert() async {

    // get a reference to the database
    // because this is an expensive operation we use async and await
    Database db = await DatabaseHelper.instance.database;

    // row to insert
    Map<String, dynamic> row = {
      DatabaseHelper.columnName : 'Bob',
      DatabaseHelper.columnAge  : 23
    };

    // do the insert and get the id of the inserted row
    int id = await db.insert(DatabaseHelper.table, row);

    // show the results: print all rows in the db
    print(await db.query(DatabaseHelper.table));
  }

Notes

  • 您必须导入DatabaseHelper类和sqflite如果您在另一个文件中(例如 main.dart)。
  • SQFlite 插件使用Map<String, dynamic>将列名称映射到每行中的数据。
  • 我们没有指定id。 SQLite 自动为我们增加它。

原始刀片

SQFlite 还支持进行原始插入。这意味着您可以使用 SQL 字符串。让我们再次插入同一行rawInsert().

db.rawInsert('INSERT INTO my_table(name, age) VALUES("Bob", 23)');

当然,我们不想将这些值硬编码到 SQL 字符串中,但我们也不想使用像这样的插值:

String name = 'Bob';
int age = 23;
db.rawInsert('INSERT INTO my_table(name, age) VALUES($name, $age)'); // Dangerous!

这将使我们面临 SQL 注入攻击。相反,我们可以使用这样的数据绑定:

db.rawInsert('INSERT INTO my_table(name, age) VALUES(?, ?)', [name, age]);

The [name, age]中的问号占位符已填写(?, ?)。表名和列名使用插值更安全,所以我们最终可以这样做:

String name = 'Bob';
int age = 23;
db.rawInsert(
    'INSERT INTO ${DatabaseHelper.table}'
        '(${DatabaseHelper.columnName}, ${DatabaseHelper.columnAge}) '
        'VALUES(?, ?)', [name, age]);

补充代码

enter image description here

为了方便复制和粘贴,这里是布局代码main.dart:

import 'package:flutter/material.dart';
import 'package:flutter_db_operations/database_helper.dart';
import 'package:sqflite/sqflite.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SQFlite Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('sqflite'),
      ),
      body: RaisedButton(
        child: Text('insert', style: TextStyle(fontSize: 20),),
        onPressed: () {_insert();},
      ),
    );
  }

  _insert() async {

    // get a reference to the database
    // because this is an expensive operation we use async and await
    Database db = await DatabaseHelper.instance.database;

    // row to insert
    Map<String, dynamic> row = {
      DatabaseHelper.columnName : 'Bob',
      DatabaseHelper.columnAge  : 23
    };

    // do the insert and get the id of the inserted row
    int id = await db.insert(DatabaseHelper.table, row);

    // raw insert
    //
    //  String name = 'Bob';
    //  int age = 23;
    //  int id = await db.rawInsert(
    //    'INSERT INTO ${DatabaseHelper.table}'
    //          '(${DatabaseHelper.columnName}, ${DatabaseHelper.columnAge}) '
    //          'VALUES(?, ?)', [name, age]);

    print(await db.query(DatabaseHelper.table));
  }

}

Going on

  • 这篇文章是我上一篇文章的发展:Flutter 中的简单 SQFlite 数据库示例。有关其他 SQL 操作和建议,请参阅该帖子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Flutter 中使用 SQFlite 进行数据库插入 的相关文章

随机推荐

  • 从现有存储库的子目录创建新的 git 存储库

    我想从现有存储库的子文件夹中创建一个单独的存储库 将子目录分离 移动 到单独的 Git 存储库中恰恰表明了这一点 但是 我无法用它得到一个干净的仓库 我最终遇到了新存储库的两个问题 历史似乎是重复的 我无法保留分支历史记录 这是我所做的 g
  • 用 range() 以相反的顺序打印列表?

    如何生成以下列表range 在Python中 9 8 7 6 5 4 3 2 1 0 Use reversed 函数 高效 因为range实施 reversed reversed range 10 这更有意义 Update list cas
  • 关于 emacs 中的自动完成和 yasnippet

    我在 Emacs 中使用自动完成和 yasnippet 但我对它们的设置感到困惑 我将以下代码放入我的 emacs add to list load path emacs d plugins yasnippet require yasnip
  • 我应该使用 Windows 服务还是 ASP.NET 后台线程?

    我正在 ASP NET 3 5 中编写一个 Web 应用程序 它负责一些基本的数据输入场景 应用程序还有一个组件需要不断轮询一些数据并根据业务逻辑执行操作 实现 轮询 组件的最佳方法是什么 它需要每隔几分钟左右运行一次并检查数据 我过去见过
  • Android模拟器-dns-server使用

    我目前正在努力让 Android 模拟器使用在本地主机 127 0 0 1 上运行的自定义 DNS 服务器 到目前为止 我已经尝试了各种方法试图说服模拟器使用我的 DNS 服务器 但到目前为止还没有成功 最后 它总是归结为以下错误消息 WA
  • “not, and, or, not_eq..”是 C++ 标准的一部分吗? (为什么在代码中可以使用或避免它们?)

    所以它看起来像所有这些 http www cplusplus com reference clibrary ciso646 是c 中的关键字 我的问题是 这是 C 标准的一部分吗 我可以依赖它得到主要编译器的支持吗 我知道 gcc 确实支持
  • 如何在 Bash 中比较点分隔版本格式的两个字符串?

    有没有办法在 bash 上比较这些字符串 例如 2 4 5 and 2 8 and 2 4 5 1 这是一个纯 Bash 版本 不需要任何外部实用程序 bin bash vercomp if 1 2 then return 0 fi loc
  • 在 R 中将 CSV 读取为 data.frame

    我是 R 新手 正在尝试读取 csv 文档显示了一个函数read csv 但是 当我读取文件并检查变量的类型时 它会显示一个列表 文档将其显示为data frame 有人可以解释为什么会这样吗 到目前为止我的代码 mytable lt re
  • 移动设备放大 Google Apps 脚本

    我在 GAS 中制作了一个 400 像素宽的网络应用程序 我希望在加载时缩放以填充移动设备的屏幕 而不是只填充一半屏幕 尽管仍然使用固定的像素宽度 我尝试使用下面的视口代码但没有成功 Google 最近几个月解决了这个问题 并使用 addM
  • OpenSSL 静态库太大,有什么替代方法或方法可以减小其大小?

    我已经使用了 OpenSSL 1 0 的预构建静态库 但它使我的二进制文件太大 在发布模式下将其大小增加了约 800Kb 我不需要 OpenSSL 的大部分功能 例如 BIO 我使用自己的套接字 因此在代码中我只使用几个 SSL XXXXX
  • 如何防止ggplot2中的轴相交

    我正在使用 ggplot2 制作一些对数转换数据的线图 这些数据都有很大的值 在 10 6 和 10 8 之间 由于轴不是从零开始 我不想让它们在 原点 相交 以下是轴当前的样子 我更喜欢从基础图形中获得的东西 但我另外使用geom rib
  • 3D 中两个矩形之间的交集

    为了获得 3D 中两个矩形之间的交线 我将它们转换为平面 然后使用法线的叉积获得交线 然后尝试获得与矩形的每个线段的线交点 问题是这条线平行于三段 并且只与 NAN NAN NAN 中的一条相交 这是完全错误的 你能告诉我我的代码有什么问题
  • TabLayout 的选项卡未显示

    我有一个主要活动 它托管一个片段 该片段又托管一个 TabLayout 带有 ViewPager 显示选项卡栏 但不显示选项卡本身 这是我在主要活动中用于显示主机片段的代码 Fragment fragment new BMITabsFrag
  • 应用程序更新时的警报管理器[重复]

    这个问题在这里已经有答案了 我正在开发一个使用的应用程序AlarmManager对于某些进程 我想问一下我是否在 Playstore 上更新我的应用程序 更新而不是新安装 注册的警报会被取消吗 还将值SharedPreference重置 A
  • 如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?

    蟒蛇的email模块非常适合解析标头 但是 那To header可以有多个接收者 并且可能有多个To 标头 那么如何拆分每个电子邮件地址呢 我不能用逗号分隔 因为逗号可以被引用 有没有办法做到这一点 演示代码 msg To email pr
  • 在内容脚本中使用 chrome.tabs 或其他 chrome API 时,“无法读取未定义的属性”

    chrome tabs尽管我在权限块中设置了选项卡 但仍返回未定义 permissions tabs http https content scripts matches http https js js myScript js all f
  • custom_require.rb:36:in `require': 没有要加载的文件 -- myapp(LoadError)

    我收到上述错误 我所做的就是安装 rvm 并从 Mac 获得的默认 ruby 更新到 ruby 1 9 2 我的所有宝石都出现在宝石列表中 但我需要在某处指定路径吗 cheers glenno 检查您是否安装了 gemgem list如果没
  • 防止Bootstrap崩溃崩溃

    我有一个 Bootstrap 折叠 标题内有一个按钮 按钮上有clickEvent 我想防止单击按钮时发生崩溃事件 有人有提示吗 这在这里没有帮助 buttonId live click function e e preventDefaul
  • NumPy 中是否提供十进制“dtypes”?

    是十进制数据类型对象 dtypes 在 NumPy 中可用吗 gt gt gt import decimal numpy gt gt gt d decimal Decimal 1 1 gt gt gt s 123 123 23 2323 2
  • 如何在 Flutter 中使用 SQFlite 进行数据库插入

    如何使用 SQFlite 插件将数据插入 Flutter 数据库 有很多解决问题的问题 但我找不到一个可以添加规范答案的问题 我的回答如下 添加依赖项 Open pubspec yaml并在依赖项部分添加以下行 sqflite 1 0 0