Flutter 之 sqflite

Flutter SQLite数据库操作
本文详细介绍了一个使用Dart语言在Flutter框架下操作SQLite数据库的具体实现,包括数据库的初始化、创建、插入、查询等核心功能,并提供了一个在StatefulWidget中使用的示例。

直接上代码吧:

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

class DataBase {

  static final DataBase _instance = new DataBase.internal();
  factory DataBase() => _instance;

  static Database _db;

  String _dbName = 'mydb.db';

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDb();
    return _db;
  }

  DataBase.internal();

  //初始化数据库,根据路径版本号新建数据库
  initDb() async {
   // Directory directory = await getApplicationDocumentsDirectory();
    String p = await getDatabasesPath();
    String path = join(p, _dbName);
    var dataBase = await openDatabase(path, version: 1, onCreate: _onCreate);
    print('数据库创建成功,version: 1');
    return dataBase;
  }
  
  _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)');
    print("创建表成功!");
  }

  
  closeDB() {
    if (_db != null || _db.isOpen) {
      _db.close();
      _db = null;
      print("关闭成功!");
    }
  }

  insert() async {

    var dbClient = await db;

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

  query() async {

    var dbClient = await db;

    List<Map> list = await dbClient.rawQuery('SELECT * FROM Test');

  //  print(_db.path);

   // print(list);

//    for(int i = 0; i < list.length; i++)
//      print(list[i]['name']);

    return list;
  }
}

以下代码是在 StatefulWidget 的 State 中使用数据库的小示例:

sqflite 是用于 Flutter 的 SQLite 数据库插件,允许开发者在移动应用中存储和管理本地数据,它支持创建数据库、执行 SQL 查询、插入、更新、删除等操作,还支持 Android 和 iOS 平台,通过 Dart 语言操作,方便与 Flutter 应用集成[^3]。以下为 Flutter 使用 sqflite 的方法和示例: ### 安装 sqflite 在 `pubspec.yaml` 文件中添加 `sqflite` 依赖: ```yaml dependencies: sqflite: ^版本号 ``` 然后运行 `flutter pub get` 来获取依赖。 ### 基本使用步骤 1. **打开数据库**: ```dart import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; Future<Database> openMyDatabase() async { String path = join(await getDatabasesPath(), 'my_database.db'); return openDatabase( path, version: 1, onCreate: (db, version) { return db.execute( 'CREATE TABLE my_table (id INTEGER PRIMARY KEY, name TEXT)', ); }, ); } ``` 2. **创建表**:上述代码中的 `onCreate` 回调里已经创建了一个名为 `my_table` 的表,包含 `id` 和 `name` 两列。 3. **插入数据**: ```dart Future<void> insertData() async { final Database db = await openMyDatabase(); await db.insert( 'my_table', {'name': 'John'}, conflictAlgorithm: ConflictAlgorithm.replace, ); } ``` 4. **查询数据**: ```dart Future<List<Map<String, dynamic>>> queryData() async { final Database db = await openMyDatabase(); return await db.query('my_table'); } ``` 5. **更新数据**: ```dart Future<void> updateData() async { final db = await openMyDatabase(); await db.update( 'my_table', {'name': 'Jane'}, where: 'id = ?', whereArgs: [1], ); } ``` 6. **删除数据**: ```dart Future<void> deleteData() async { final db = await openMyDatabase(); await db.delete( 'my_table', where: 'id = ?', whereArgs: [1], ); } ``` ### 高级功能示例(事务处理) ```dart Future<void> transactionExample() async { final db = await openMyDatabase(); await db.transaction((txn) async { await txn.insert('my_table', {'name': 'Transaction Test'}); await txn.update( 'my_table', {'name': 'Updated in Transaction'}, where: 'name = ?', whereArgs: ['Transaction Test'], ); }); } ``` ### 实现草稿箱功能示例 在 Flutter 中实现草稿箱功能,使用 sqflite 数据库存储草稿信息,包括文件路径和最后修改时间,并使用 `path_provider` 来获取应用的缓存目录,用于存储上传的视频和图片文件: ```dart import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; class DraftBox { Database? _database; Future<Database> get database async { if (_database != null) return _database!; _database = await _initDB(); return _database!; } Future<Database> _initDB() async { var documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, 'draft_box.db'); return await openDatabase( path, version: 1, onCreate: (db, version) { return db.execute( 'CREATE TABLE drafts (id INTEGER PRIMARY KEY, filePath TEXT, lastModified TEXT)', ); }, ); } Future<void> insertDraft(String filePath, String lastModified) async { final db = await database; await db.insert( 'drafts', {'filePath': filePath, 'lastModified': lastModified}, conflictAlgorithm: ConflictAlgorithm.replace, ); } Future<List<Map<String, dynamic>>> getDrafts() async { final db = await database; return await db.query('drafts'); } } ``` ### 删除不需要的数据示例 ```dart Future<void> deleteUrl(String url) async { final db = await database; await db.delete( 'Domain', where: 'url = ?', whereArgs: [url], ); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值