Flutter——SQLite数据库的使用与封装

SQLite数据库使用与封装

导入依赖

 #数据库
  sqflite: ^2.2.0+3

创建实体类

根据自己的所要存储的内容创建一个实体类,并构建Map映射存取两个方法

class MovieFavorite{
  late String doubanId;//豆瓣id
  late String moviePoster;//电影海报
  late String movieName;//电影名称
  late String movieCountry;//电影国家
  late String movieLanguage;//电影语言
  late String movieGenre;//电影类型
  late String movieDescription; //电影描述

  MovieFavorite(
      this.doubanId,
      this.moviePoster,
      this.movieName,
      this.movieCountry,
      this.movieLanguage,
      this.movieGenre,
      this.movieDescription
      );

  MovieFavorite.fromJson(dynamic json){
    doubanId = json['doubanId'];
    moviePoster = json['MoviePoster'];
    movieName = json['MovieName'];
    movieCountry = json['MovieCountry'];
    movieLanguage = json['MovieLanguage'];
    movieGenre = json['MovieGenre'];
    movieDescription = json['MovieDescription'];
  }

  Map<String,dynamic> toJson(){
    final map = <String,dynamic>{};
    map['doubanId'] = doubanId;
    map['MoviePoster'] = moviePoster;
    map['MovieName'] = movieName;
    map['MovieCountry'] = movieCountry;
    map['MovieLanguage'] = movieLanguage;
    map['MovieGenre'] = movieGenre;
    map['MovieDescription'] = movieDescription;
    return map;
  }
}

建表

下面是创建了俩个数据库表

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


class DBManager{
  final int _version = 4;//版本号
  final String _databaseName = 'Movie.db';//数据库名称

  ///收藏表
  static const String favoriteTable = 'FavoriteTable';//表名
  static const String doubanId = 'doubanId';//primary key
  static const String _moviePoster = 'MoviePoster';//电影海报
  static const String _movieName = 'MovieName';//电影名称
  static const String _movieCountry = 'MovieCountry';//电影国家
  static const String _movieLanguage = 'MovieLanguage';//电影语言
  static const String _movieGenre = 'MovieGenre';//电影类型(可能为空)
  static const String _movieDescription = 'MovieDescription';//电影描述

  ///搜索记录表
  static const String searchTable = 'SearchTable';//表名
  static const String searchKey = 'SearchKey';


  static DBManager? _instance;
  static DBManager getInstance() => _instance ??= DBManager();

  static Database? _database;
  Future<Database> get getDatabase async => _database ??= await _initSQl();

  ///初始化数据库
  Future<Database> _initSQl() async{
    var dbPath = await getDatabasesPath();
    var path = join(dbPath,_databaseName);
    return await openDatabase(path,version: _version,onCreate: _onCreate);
  }

  ///创建表
  Future _onCreate(Database db,int version) async{
    String favoriteSQL =
      '''
      CREATE TABLE $favoriteTable(
      $doubanId TEXT PRIMARY KEY,
      $_moviePoster TEXT,
      $_movieName TEXT,
      $_movieCountry TEXT,
      $_movieLanguage TEXT,
      $_movieGenre TEXT,
      $_movieDescription TEXT
      )
      ''';

    String searchSQL =
      '''
      CREATE TABLE $searchTable(
      $searchKey TEXT PRIMARY KEY
      )
      ''';

    await db.execute(favoriteSQL);
    await db.execute(searchSQL);
  }
}

封装Dao

然后对增删改查四个功能进行单独封装

class FavoriteDao{

  static FavoriteDao? _instance;
  static FavoriteDao getInstance() => _instance ??= FavoriteDao();

  ///插入数据
  Future<int> insert(MovieFavorite bean) async{
    Database db = await DBManager.getInstance().getDatabase;
    return await db.insert(DBManager.favoriteTable, bean.toJson());
  }

  ///修改数据
  // Future<int> update() async{
  //   Database db = await database;
  //   await db.update(table, values)
  // }

  ///删除数据
  Future<int> delete(String doubanId) async{
    Database db = await DBManager.getInstance().getDatabase;
    return await db.delete(DBManager.favoriteTable,where:'${DBManager.doubanId} = ?',whereArgs:[doubanId]);
  }

  ///删除全部数据
  Future<int> deleteAll() async{
    Database db = await DBManager.getInstance().getDatabase;
    return await db.delete(DBManager.favoriteTable);
  }

  ///查询数据
  Future<List<MovieFavorite>> query(String doubanId) async {
    Database db = await DBManager.getInstance().getDatabase;
    var result = await db.query(DBManager.favoriteTable, where: '${DBManager.doubanId} = ?', whereArgs: [doubanId]);
    if (result.isNotEmpty) {
      return result.map((e) => MovieFavorite.fromJson(e)).toList();
    } else {
      return [];
    }
  }

  根据doubanId查询判断是否存在
  Future<bool> isExist(String doubanId) async {
    Database db = await DBManager.getInstance().getDatabase;
    var result = await db.query(DBManager.favoriteTable, where: '${DBManager.doubanId} = ?', whereArgs: [doubanId]);
    if (result.isNotEmpty) {
      return true;
    } else {
      return false;
    }
  }

  ///查询所有数据
  Future<List<MovieFavorite>> queryAll() async {
    Database db = await DBManager.getInstance().getDatabase;
    var result = await db.query(DBManager.favoriteTable);
    if (result.isNotEmpty) {
      return result.map((e) => MovieFavorite.fromJson(e)).toList();
    } else {
      return [];
    }
  }
}

使用

exeFavoriteInsert(MovieFavorite entity,BuildContext context) async {
  bool isExist = await FavoriteDao.getInstance().isExist(entity.doubanId);
  if(!isExist){
    int flag = await FavoriteDao.getInstance().insert(entity);
    final favoriteProvide = context.read<FavoriteProvider>();
    final List<MovieFavorite> list = [entity];
    favoriteProvide.favoriteList = list;

    if (flag > 0) {
      showSuccessToast('收藏成功!');
    } else {
      showFailedToast('收藏失败!');
    }
  }else{
    showFailedToast('此影片已被收藏,请勿重复添加!');
  }
}

isFavoriteInserted(String doubanId) async => await FavoriteDao.getInstance().isExist(doubanId);
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Flutter是一种跨平台的移动应用程序开发框架,它提供了使用SQLite数据库的内置支持。 要使用SQLite数据库,您需要使用Fluttersqlite包。您可以通过在pubspec.yaml文件中添加以下依赖项来获取此包: ```yaml dependencies: sqflite: ^2.0.0+3 ``` 一旦您添加了依赖项并运行了`flutter packages get`,您就可以开始使用SQLite数据库了。以下是如何使用SQLite数据库的一些示例: ### 创建数据库 ```dart import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; final database = openDatabase( join(await getDatabasesPath(), 'my_database.db'), onCreate: (db, version) { return db.execute( 'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)', ); }, version: 1, ); ``` 在这个示例中,我们创建了一个名为`my_database.db`的数据库,并在其中创建了一个名为“users”的表。 ### 插入数据 ```dart await database.insert( 'users', {'id': 1, 'name': 'John', 'age': 30}, ); ``` 在这个示例中,我们向“users”表中插入了一条数据。 ### 查询数据 ```dart final List<Map<String, dynamic>> users = await database.query('users'); ``` 在这个示例中,我们查询了“users”表中的所有数据。 ### 更新数据 ```dart await database.update( 'users', {'age': 31}, where: 'name = ?', whereArgs: ['John'], ); ``` 在这个示例中,我们将“users”表中名为“John”的用户的年龄更新为31岁。 ### 删除数据 ```dart await database.delete( 'users', where: 'name = ?', whereArgs: ['John'], ); ``` 在这个示例中,我们删除了“users”表中名为“John”的用户的记录。 这是使用FlutterSQLite数据库的一些基本示例。您可以使用这些示例来开始使用SQLite数据库,并根据您的需求进行修改。 ### 回答2: 在Flutter中,可以使用sqflite插件来实现对SQLite数据库的增删改查操作。 首先,需要在pubspec.yaml文件中添加sqflite插件的依赖: ``` dependencies: sqflite: ^x.x.x ``` 然后,在需要使用SQLite数据库的地方引入sqflite库: ``` import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; ``` 接下来,创建一个数据库的帮助类,用于管理数据库的创建和版本更新。可以创建一个名为DatabaseHelper的类,并在其内部提供一些静态方法。 ``` class DatabaseHelper { static Future<Database> database() async { String path = join(await getDatabasesPath(), 'database.db'); return await openDatabase(path, version: 1, onCreate: _createTable); } static Future<void> _createTable(Database db, int version) async { await db.execute('CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)'); } } ``` 在这个类中,我们定义了一个数据库方法,该方法通过getDatabasesPath()获取数据库的路径,并将其与数据库名称拼接在一起以获取完整路径。然后,我们通过openDatabase()方法打开数据库,如果数据库不存在,则创建数据库,并在数据库中创建名为users的表。 然后,可以在其他地方使用这个DatabaseHelper类,执行增删改查的操作。 ``` class UserRepository { static Future<void> addUser(String name) async { Database db = await DatabaseHelper.database(); await db.insert('users', {'name': name}); } static Future<void> deleteUser(int id) async { Database db = await DatabaseHelper.database(); await db.delete('users', where: 'id = ?', whereArgs: [id]); } static Future<void> updateUser(int id, String name) async { Database db = await DatabaseHelper.database(); await db.update('users', {'name': name}, where: 'id = ?', whereArgs: [id]); } static Future<List<Map<String, dynamic>>> getUsers() async { Database db = await DatabaseHelper.database(); return await db.query('users'); } } ``` 在这个示例中,我们通过addUser()方法向数据库中的users表中插入一条数据,通过deleteUser()方法根据id来删除数据,通过updateUser()方法根据id来更新数据,通过getUsers()方法获取所有的用户数据。 以上就是使用sqflite插件在Flutter使用SQLite数据库实现增删改查的基本步骤。要注意的是,在实际使用中,还需要处理数据库的异常情况和事务处理。 ### 回答3: 使用Flutter操作SQLite数据库的步骤如下: 1. 导入相关依赖:在pubspec.yaml文件中添加sqflite和path两个依赖。 ``` dependencies: flutter: sdk: flutter sqflite: ^2.0.0 path: ^2.0.0 ``` 2. 创建数据库:在Flutter中,可以使用openDatabase函数创建一个SQLite数据库。 ```dart import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; final String tableName = 'person'; // 表名 Future<Database> database() async { return openDatabase( join(await getDatabasesPath(), 'database.db'), // 数据库名 onCreate: (db, version) { return db.execute( 'CREATE TABLE $tableName(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)', ); // 创建表 }, version: 1, // 数据库版本号 ); } ``` 3. 插入数据:使用insert函数将数据插入到数据库中。 ```dart Future<void> insertPerson(Person person) async { final db = await database(); await db.insert( tableName, person.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, // 冲突处理策略 ); } ``` 4. 查询数据:使用query函数从数据库中查询数据。 ```dart Future<List<Map<String, dynamic>>> queryAllPersons() async { final db = await database(); return db.query(tableName); } ``` 5. 更新数据:使用update函数更新数据库中的数据。 ```dart Future<void> updatePerson(Person person) async { final db = await database(); await db.update( tableName, person.toMap(), where: 'id = ?', whereArgs: [person.id], // 条件参数,保证更新正确的记录 ); } ``` 6. 删除数据:使用delete函数删除数据库中的数据。 ```dart Future<void> deletePerson(int id) async { final db = await database(); await db.delete( tableName, where: 'id = ?', whereArgs: [id], // 条件参数,保证删除正确的记录 ); } ``` 以上就是在Flutter使用SQLite数据库实现增删改查的基本步骤。有了这些操作,你可以方便地处理数据库数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FranzLiszt1847

嘟嘟嘟嘟嘟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值