Flutter持久化存储方案 SQLite数据库使用指南

在Flutter中使用SQLite进行持久化存储时,遇到几个问题想请教:

  1. SQLite数据库文件在Flutter中默认存储在什么位置?不同平台的存储路径是否有差异?

  2. 如何处理数据库版本升级?比如新增表或修改表结构时,如何编写迁移脚本才能避免数据丢失?

  3. 使用sqflite插件时,打开数据库出现"database is locked"错误该如何解决?是否有推荐的事务处理最佳实践?

  4. 对于大量数据的批量插入操作,如何优化性能?看到有人说用事务能提速,具体应该如何实现?

  5. 能否分享一个完整的CRUD示例?网上找到的代码片段都是分散的,希望能看到从建表到查询的完整流程。


更多关于Flutter持久化存储方案 SQLite数据库使用指南的实战教程也可以访问 https://www.itying.com/category-92-b0.html

3 回复

作为屌丝程序员,推荐使用SQLite数据库进行Flutter应用的本地持久化存储。首先,通过sqflite插件接入SQLite。

  1. 初始化数据库:创建数据库连接,通常在initState()中操作。示例代码:

    final Future<Database> database = openDatabase(
      'my_database.db',
      version: 1,
      onCreate: (db, version) {
        return db.execute("CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT)");
      },
    );
    
  2. 增删改查:执行CRUD操作。例如插入数据:

    Future<void> insertData(Map<String, dynamic> row) async {
      final Database db = await database;
      await db.insert('test', row);
    }
    
  3. 查询数据:可使用query方法获取记录:

    Future<List<Map<String, dynamic>>> getData() async {
      final Database db = await database;
      return db.query('test');
    }
    
  4. 事务处理:复杂操作时用transaction保证一致性。

  5. 注意事项:确保数据类型匹配,避免性能瓶颈;对于大量数据考虑分页加载。

SQLite轻量且高效,适合中小型项目的数据存储需求。

更多关于Flutter持久化存储方案 SQLite数据库使用指南的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


作为一个屌丝程序员,推荐在Flutter中使用SQLite进行持久化存储。首先添加sqflite依赖到pubspec.yaml文件:

dependencies:
  sqflite: ^2.0.0+4

然后初始化数据库:

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

Future<Database> initializeDB() async {
  String path = join(await getDatabasesPath(), 'demo.db');
  return await openDatabase(path, version: 1, onCreate: createDB);
}

void createDB(Database db, int version) async {
  await db.execute('CREATE TABLE Test(id INTEGER PRIMARY KEY, name TEXT)');
}

插入数据:

Future<void> insertData(String name) async {
  Database db = await initializeDB();
  await db.insert('Test', {'name': name}, conflictAlgorithm: ConflictAlgorithm.replace);
}

查询数据:

Future<List<Map<String, dynamic>>> readData() async {
  Database db = await initializeDB();
  return await db.query('Test');
}

更新和删除类似操作,利用SQL语句完成。记得处理异常和关闭数据库连接,这样可以保证程序健壮性。最后,别忘了测试数据库操作功能是否正常。

Flutter SQLite 持久化存储使用指南

SQLite 是 Flutter 中常用的本地数据库解决方案,适合需要结构化数据存储的场景。

核心步骤

  1. 添加依赖pubspec.yaml 中添加:
dependencies:
  sqflite: ^2.0.0
  path: ^2.0.0
  1. 数据库创建与升级
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future<Database> initializeDB() async {
  final databasePath = await getDatabasesPath();
  final path = join(databasePath, 'my_database.db');
  
  return openDatabase(
    path,
    onCreate: (db, version) {
      return db.execute(
        'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
      );
    },
    version: 1,
  );
}
  1. CRUD 操作示例
// 插入数据
Future<int> insertUser(User user) async {
  final db = await initializeDB();
  return await db.insert('users', user.toMap());
}

// 查询所有用户
Future<List<User>> getUsers() async {
  final db = await initializeDB();
  final List<Map<String, dynamic>> maps = await db.query('users');
  return List.generate(maps.length, (i) {
    return User.fromMap(maps[i]);
  });
}

// 更新用户
Future<int> updateUser(User user) async {
  final db = await initializeDB();
  return await db.update(
    'users',
    user.toMap(),
    where: 'id = ?',
    whereArgs: [user.id],
  );
}

// 删除用户
Future<int> deleteUser(int id) async {
  final db = await initializeDB();
  return await db.delete(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );
}
  1. 模型类示例
class User {
  final int? id;
  final String name;
  final int age;

  User({this.id, required this.name, required this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

最佳实践

  1. 使用事务处理批量操作
  2. 考虑使用 moorhive 等更高级的库简化操作
  3. 数据库操作放在隔离线程中进行
  4. 适时关闭数据库连接

这是 Flutter 中使用 SQLite 的基本方法,适用于中小规模的本地数据存储需求。

回到顶部