栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

添加依赖项

打开

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

sqflite: ^1.0.0path_provider: ^0.4.1

sqflite
是SQFlite当然插件和
path_provider
将帮助我们在Android和iPhone用户目录。

制作数据库助手类

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

创建一个名为 database_helper.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 pre 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));  }

笔记

  • 如果您在另一个文件中(例如main.dart)
    DatabaseHelper
    sqflite
    则必须导入该类。
  • 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]);

[name, age]
是在问号占位符填充
(?, ?)
。表名和列名更安全地用于交互,因此我们最终可以这样做:

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

补充代码

为了方便您复制和粘贴,以下是以下代码的布局代码

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

继续

  • 这篇文章是我以前的文章的发展:Flutter中的Simple SQFlite数据库示例。有关其他SQL操作和建议,请参阅该帖子。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号