Flutter中使用sqlite

在本教程中,我们将介绍如何在flutter中使用sqlite。 SQLite是用于移动设备和某些计算机SQL引擎。 我们可以使用它来保存应用程序的数据。 持久性存储对于在加载新数据时缓存网络呼叫和脱机应用程序很有用。 

引入依赖:查询sqflite最新版本地址: 点击以下地址查询

sqflite | Flutter Package

在flutter项目中引入相关依赖:

 sqflite: ^2.0.0+4 #sqlite数据库
 path_provider: ^2.0.11 #用于获取主机平台文件系统上常用的位置,如temp和app数据目录
 fluttertoast: 8.0.9 #自定义弹窗

在需要用sqlite的组件里面指定包路径就可以了

import 'package:path_provider/path_provider.dart';

import 'package:sqflite/sqflite.dart';

自定义弹窗组件:

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

void okToast(String text) {
   Fluttertoast.showToast(
    msg: text,
    toastLength: Toast.LENGTH_SHORT,
    gravity: ToastGravity.CENTER,
    timeInSecForIosWeb: 1,
    backgroundColor: Colors.blue,
    textColor: Colors.white,
    fontSize: 16.0);
}

void errorToast(String text) {
   Fluttertoast.showToast(
    msg:text,
    toastLength: Toast.LENGTH_SHORT,
    gravity: ToastGravity.CENTER,
    timeInSecForIosWeb: 1,
    backgroundColor: Colors.red,
    textColor: Colors.white,
    fontSize: 16.0);
}

 为了减少小伙伴们拷贝代码时出错,里面的组件就不分包了,避免拷贝代码不全出现的错误,该项目将会全部代码放在一个主组件main下面,代码能正常运行后可以自行分包管理

// ignore_for_file: use_build_context_synchronously

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import '../FlutterToast.dart';

/**
 * sqlite用户数据管理类,该界面不提供给用户
 */
class SqlitePage extends StatefulWidget {
  const SqlitePage({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _SqlitePageState();
  }
}

class _SqlitePageState extends State<SqlitePage> {
  List<User>? _userList;

  loadAllData() async {
    _userList = await DBManager().findAll();
    setState(() {});
  }

  updateData(User user) async {
    var count = await DBManager().update(user);
    if (count > 0) {
      okToast("修改成功");
    } else {
      errorToast("修改失败");
    }
  }

  deleteData(int id) async {
    var count = await DBManager().delete(id);
    if (count > 0) {
      okToast("删除成功");
    } else {
      errorToast("删除失败");
    }
  }

  deleteAllData() async {
    var count = await DBManager().deleteAll();
    if (count > 0) {
      okToast("删除全部成功");
    } else {
      errorToast("删除全部失败");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("账号管理"),
        actions: [
          IconButton(
            icon: const Icon(Icons.add),
            onPressed: () {
              Navigator.push(context, MaterialPageRoute(builder: (context) {
                return const AddStudentPage();
              }));
            },
          )
        ],
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () {
                  loadAllData();
                },
                child: const Text("查询数据库所有数据"),
              ),
              ElevatedButton(
                onPressed: () {
                  deleteAllData();
                },
                child: const Text("删除数据库所有数据"),
              ),
              Padding(
                padding: const EdgeInsets.all(10),
                child: _buildTable(),
              ),
            ],
          ),
        ),
      ),
    );
  }

  _buildTable() {
    return Table(
      border: TableBorder.all(),
      defaultVerticalAlignment: TableCellVerticalAlignment.middle,
      children: [
        const TableRow(children: [
          TableCell(child: Text("id",style: TextStyle(color: Colors.orange),)),
          TableCell(child: Text("用户名",style: TextStyle(color: Colors.red),)),
          TableCell(child: Text("密码",style: TextStyle(color: Colors.blue),)),
          TableCell(child: Text("权限",style: TextStyle(color: Colors.white),)),
          TableCell(child: Text("修改",style: TextStyle(color: Colors.lightBlue),)),
          TableCell(child: Text("删除",style: TextStyle(color: Colors.red),)),
        ]),
        ...?_userList
            ?.map((e) => TableRow(children: [
                  TableCell(child: Text("${e.id}")),
                  TableCell(child: Text("${e.name}")),
                  TableCell(child: Text("${e.pwd}")),
                  TableCell(child: Text("${e.power}")),
                  TableCell(
                    child: TextButton(
                      onPressed: () {
                        updateData(e);
                      },
                      child: const Text("修改"),
                    ),
                  ),
                  TableCell(
                    child: TextButton(
                      onPressed: () {
                        deleteData(e.id!);
                      },
                      child: const Text("删除"),
                    ),
                  ),
                ]))
            .toList(),
      ],
    );
  }
}

/**
 * 初始化
 */
class DBManager {
  /// 数据库名
  final String _dbName = "skzn";
  /// 数据库版本
  final int _version = 1;
  static final DBManager _instance = DBManager._();
  factory DBManager() {
    return _instance;
  }

  DBManager._();
  static Database? _db;
  Future<Database> get db async {
    return _db ??= await _initDB();
  }

  /// 初始化数据库
  Future<Database> _initDB() async {
    Directory directory = await getApplicationDocumentsDirectory();
    String path = join(directory.path, _dbName);

    return await openDatabase(
      path,
      version: _version,
      onCreate: _onCreate,
      onUpgrade: _onUpgrade,
    );
  }

  /// 创建表
  Future _onCreate(Database db, int version) async {
    const String sql = """
    CREATE TABLE User(
      id INTEGER primary key AUTOINCREMENT,
      name TEXT,
      pwd TEXT,
      power INTEGER
    )
    """;
    return await db.execute(sql);
  }

  /// 更新表
  Future _onUpgrade(Database db, int oldVersion, int newVersion) async {}

  /// 使用SQL保存数据
  Future saveDataBySQL(User user) async {
    const String sql = """
    INSERT INTO User(name,pwd,power) values(?,?,?)
    """;
    Database database = await db;
    return await database.rawInsert(sql, [user.name, user.pwd, user.power]);
  }

  /// 查询全部数据
  Future<List<User>?> findAll() async {
    Database? database = await db;
    List<Map<String, Object?>> result = await database.query("User");
    if (result.isNotEmpty) {
      return result.map((e) => User.fromJson(e)).toList();
    } else {
      return [];
    }
  }

  /**
   * 条件查询
   *  ==》该方法主要用于用户登录,通过传入用户名和密码来查询数据库
   * 用法:直接在登录按钮里面直接调用:DBManager().find(_username, _password, context);
   */
  Future<List<User>?> find(
      String name, String password, BuildContext context) async {
    Database database = await db;
    List<Map<String, Object?>> result = await database.query("User",
        where: "name =? and pwd=? ", whereArgs: [name, password]);

    if (result.isNotEmpty) {
      okToast("登录成功");
      // GoRouter.of(context).go('/main'); //登录成功跳转的页面
    } else {
      errorToast("用户名或者密码错误");
    }
    return null;
  }

  /**
   * 条件查询  
   * ==》该方法用于默然一个管理员账号,通过登录的时候判断登录的是否为管理员
   * 用法:直接在登录按钮里面直接调用:DBManager().find(_username, _password, context);
   */
  Future<List<User>?> LoginQuery(
      String name, String password, BuildContext context) async {
    String username = 'admin';
    String pwd = 'sk123';
    Database database = await db;
    List<Map<String, Object?>> result = await database.query("User",
        where: "name =? and pwd=? ", whereArgs: [name, password]);

    if (result.isNotEmpty) {
      if (name == username && password == pwd) {
        // GoRouter.of(context).go('/main'); //查询结果为管理员跳转的页面
        print("管理员界面");
      } else {
        // GoRouter.of(context).go('/main'); //查询结果为用户跳转的页面
        print("测试用户界面");
      }
    }
    return null;
  }

/**
 * 添加默认账户表单 
 * ==>sqlite存储的本地文件,当用户使用app的时候是本地文件是没有数据的,所以我们要在新用户登录的时候创建一个默认本地账户表
 *  用法: 在登录按钮里面直接调用: DBManager().insertUser();
 */
  Future<int?> insertUser() async {
    Database? database = await db;
    List<Map<String, Object?>> result = await database.query("User");
    if (result.isEmpty) {
      var admin = User(
        name: 'admin',
        pwd: 'admin123',
        power: 1,
      );
      var test = User(
        name: 'test',
        pwd: 'test123',
        power: 1,
      );
      await DBManager().saveDataBySQL(admin);
      await DBManager().saveDataBySQL(test);
    } else {
      return null;
    }
    return null;
  }

  /**
   * 修改表中的某一项的值为自定义的默认值
   */
  Future<int> update(User user) async {
    Database database = await db;
    user.pwd = '123456'; //修改表中password字段的默认值为 123456
    int count = await database
        .update("User", user.toJson(), where: "id=?", whereArgs: [user.id]);
    return count;
  }

  /**
   * 删除操作
   * 根据id删除
   */
  Future<int> delete(int id) async {
    Database database = await db;
    int count = await database.delete("User", where: "id=?", whereArgs: [id]);
    return count;
  }

  /**
   * 删除全部数据
   */
  Future<int> deleteAll() async {
    Database database = await db;
    int count = await database.delete("User");
    return count;
  }
}

/**
 * 数据实体
 */
User studentFromJson(String str) => User.fromJson(json.decode(str));
String studentToJson(User data) => json.encode(data.toJson());

class User {
  User({
    this.id,
    this.name,
    this.pwd,
    this.power,
  });

  User.fromJson(dynamic json) {
    id = json['id'];
    name = json['name'];
    pwd = json['pwd'];
    power = json['power'];
  }

  int? id;
  String? name;
  String? pwd;
  int? power;

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    map['name'] = name;
    map['pwd'] = pwd;
    map['power'] = power;
    return map;
  }
}

class AddStudentPage extends StatefulWidget {
  const AddStudentPage({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _AddStudentPageState();
  }
}

class _AddStudentPageState extends State<AddStudentPage> {
  int _sexValue = 0;
  late TextEditingController _nameController;
  late TextEditingController _ageController;

  @override
  void initState() {
    _nameController = TextEditingController();
    _ageController = TextEditingController();
    super.initState();
  }

  @override
  void dispose() {
    _nameController.dispose();
    _ageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("添加用户账号"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: const InputDecoration(labelText: "用户名:"),
            ),
            TextField(
              controller: _ageController,
              decoration: const InputDecoration(labelText: "密码:"),
              //限制输入框输入只能为数字
              // inputFormatters: [
              //   FilteringTextInputFormatter.digitsOnly,
              // ],
            ),
            Row(
              children: [
                Expanded(
                  child: RadioListTile<int>(
                    title: const Text("管理员"),
                    value: 0,
                    groupValue: _sexValue,
                    onChanged: (value) {
                      setState(() {
                        _sexValue = value!;
                      });
                    },
                  ),
                ),
                Expanded(
                  child: RadioListTile<int>(
                    title: const Text("测试用户"),
                    value: 1,
                    groupValue: _sexValue,
                    onChanged: (value) {
                      setState(() {
                        _sexValue = value!;
                      });
                    },
                  ),
                ),
              ],
            ),
            Builder(builder: (BuildContext context) {
              return Column(
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      var user = User(
                        name: _nameController.text.toString(),
                        pwd: _ageController.text.toString(),
                        power: _sexValue,
                      );
                      int result = await DBManager().saveDataBySQL(user);
                      if (result > 0) {
                        okToast("保存数据成功,result:$result");
                      } else {
                        errorToast("保存数据失败,result:$result");
                      }
                    },
                    child: const Text("添加"),
                  ),
                ],
              );
            }),
          ],
        ),
      ),
    );
  }
}

 运行效果展示:

添加拥护页面: 

 

 最后的测试功能就不一一展示了

### 回答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数据库实现增删改查的基本步骤。有了这些操作,你可以方便地处理数据库数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值