Flutter教程SQLite数据库的操作

在Flutter中使用SQLite数据库时遇到几个问题想请教:

  1. 如何创建和初始化SQLite数据库?有没有完整示例代码可以参考?
  2. 增删改查操作的具体实现方式是什么?比如插入数据时如何避免重复?
  3. 数据库升级时如何处理表结构变更?需要手动迁移数据吗?
  4. 在多线程环境下操作SQLite需要注意哪些问题?
  5. 有没有性能优化的建议?比如大批量数据插入的情况。
  6. 遇到"database locked"错误该如何解决?
    求有经验的开发者分享最佳实践,谢谢!
3 回复

在Flutter中操作SQLite数据库可以使用sqflite插件。首先添加依赖:在pubspec.yaml里加入sqflite: ^2.0.0path: ^1.8.0

创建数据库助手类:

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

class DatabaseHelper {
  static final _databaseName = "myDatabase.db";
  static final _databaseVersion = 1;

  static final table = 'myTable';
  static final columnId = '_id';
  static final columnName = 'name';

  // 创建数据库实例
  static Database? _database;
  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);
    return await openDatabase(path,
        version: _databaseVersion, onCreate: _onCreate);
  }

  // 创建表
  void _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE $table (
        $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
        $columnName TEXT NOT NULL
      )
    ''');
  }

  // 插入数据
  Future<int> insert(Map<String, dynamic> row) async {
    Database db = await database;
    return await db.insert(table, row);
  }

  // 查询所有数据
  Future<List<Map<String, dynamic>>> queryAll() async {
    Database db = await database;
    return await db.query(table);
  }
}

通过这个类你可以实现增删改查操作。例如插入数据:await DatabaseHelper().insert({'name': 'test'});

更多关于Flutter教程SQLite数据库的操作的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


作为屌丝程序员,分享一个简单的Flutter操作SQLite的步骤:

  1. 引入依赖:在pubspec.yaml中添加sqflitepath_provider
dependencies:
  sqflite: ^2.0.0+4
  path_provider: ^2.0.9
  1. 创建数据库:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future<Database> initializeDB() async {
  String path = join(await getDatabasesPath(), 'mydb.db');
  return openDatabase(path, version: 1, onCreate: (db, version) {
    db.execute("CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT)");
  });
}
  1. 插入数据:
Future<void> insertUser(String name) async {
  final Database db = await initializeDB();
  await db.insert('users', {'name': name}, conflictAlgorithm: ConflictAlgorithm.replace);
}
  1. 查询数据:
Future<List<Map<String, dynamic>>> getUsers() async {
  final Database db = await initializeDB();
  return db.query('users');
}
  1. 删除数据:
Future<void> deleteUser(int id) async {
  final Database db = await initializeDB();
  await db.delete('users', where: 'id = ?', whereArgs: [id]);
}

这个基础框架可以帮助你在Flutter项目中进行SQLite数据库的操作。

Flutter SQLite数据库操作教程

SQLite是Flutter中常用的轻量级数据库解决方案,以下是基本操作方法:

1. 添加依赖

首先在pubspec.yaml中添加依赖:

dependencies:
  sqflite: ^2.0.0
  path: ^1.8.0

2. 创建数据库和表

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 AUTOINCREMENT, name TEXT, age INTEGER)',
      );
    },
    version: 1,
  );
}

3. 基本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],
  );
}

4. 数据模型类

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

在使用时记得将数据库操作放在try-catch块中以处理可能的异常。对于更复杂的查询,可以使用rawQuery方法执行原生SQL语句。

回到顶部