首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

简单的Flutter sqflite登录->写入数据库->导航->从数据库流中检索

基础概念

Flutter 是一个用于构建跨平台移动应用的 UI 工具包。Sqflite 是 Flutter 社区提供的一个轻量级 SQLite 数据库插件,它允许你在 Flutter 应用中使用 SQLite 数据库。

相关优势

  • 跨平台:Flutter 本身支持 Android 和 iOS 平台,结合 Sqflite 可以在不同平台上使用相同的数据库逻辑。
  • 轻量级:Sqflite 是一个轻量级的库,易于集成和使用。
  • 本地存储:SQLite 数据库提供了本地存储能力,适合存储应用数据。

类型

  • 单表查询:基本的 CRUD(创建、读取、更新、删除)操作。
  • 多表查询:涉及多个表的连接查询。
  • 事务处理:确保数据库操作的原子性。

应用场景

  • 用户登录信息存储。
  • 应用设置保存。
  • 离线数据存储和检索。

示例代码

以下是一个简单的 Flutter 应用示例,展示了如何使用 Sqflite 进行用户登录信息的存储和检索。

添加依赖

首先,在 pubspec.yaml 文件中添加 Sqflite 依赖:

代码语言:txt
复制
dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4

初始化数据库

代码语言:txt
复制
import 'package:sqflite/sqflite.dart';
import 'dart:async';

class DatabaseHelper {
  static final DatabaseHelper _instance = new DatabaseHelper._internal();
  factory DatabaseHelper() => _instance;
  static Database? _database;

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  DatabaseHelper._internal();

  Future<Database> _initDatabase() async {
    return openDatabase(
      'user_database.db',
      version: 1,
      onCreate: _onCreate,
    );
  }

  void _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE user(id INTEGER PRIMARY KEY, username TEXT, password TEXT)',
    );
  }
}

用户登录和数据写入

代码语言:txt
复制
Future<void> addUser(String username, String password) async {
  final db = await DatabaseHelper().database;
  await db.insert(
    'user',
    {'username': username, 'password': password},
  );
}

Future<bool> loginUser(String username, String password) async {
  final db = await DatabaseHelper().database;
  final List<Map<String, dynamic>> users = await db.query('user');
  for (var user in users) {
    if (user['username'] == username && user['password'] == password) {
      return true;
    }
  }
  return false;
}

导航和数据检索

代码语言:txt
复制
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Sqflite Demo')),
        body: LoginScreen(),
      ),
    );
  }
}

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _formKey = GlobalKey<FormState>();
  String _username = '';
  String _password = '';

  Future<void> _submitForm() async {
    if (_formKey.currentState!.validate()) {
      bool isLoggedIn = await loginUser(_username, _password);
      if (isLoggedIn) {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => HomeScreen()),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Invalid login')),
        );
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          TextFormField(
            decoration: InputDecoration(labelText: 'Username'),
            validator: (value) {
              if (value!.isEmpty) return 'Please enter username';
              return null;
            },
            onSaved: (value) => _username = value!,
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: (value) {
              if (value!.isEmpty) return 'Please enter password';
              return null;
            },
            onSaved: (value) => _password = value!,
          ),
          ElevatedButton(
            onPressed: _submitForm,
            child: Text('Login'),
          ),
        ],
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: FutureBuilder<bool>(
          future: loginUser('admin', 'admin'),
          builder: (context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text(snapshot.data! ? 'Logged In' : 'Not Logged In');
            }
          },
        ),
      ),
    );
  }
}

常见问题及解决方法

问题:数据库初始化失败

原因:可能是由于权限问题或数据库路径不正确。

解决方法:确保应用有足够的权限访问存储,并检查数据库路径是否正确。

问题:数据写入失败

原因:可能是由于数据库连接未正确建立或插入语句有误。

解决方法:确保数据库连接已正确建立,并检查插入语句的语法和数据类型。

问题:数据检索不正确

原因:可能是查询语句有误或数据未正确写入。

解决方法:检查查询语句的语法,并确保数据已正确写入数据库。

参考链接

通过以上示例和解释,你应该能够理解如何在 Flutter 应用中使用 Sqflite 进行用户登录信息的存储和检索。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

FlutterUnit 桌面分支合并,一套代码 - 五端通行

sqflite: ^2.0.2+1 # 数据库 sqflite_common_ffi: ^2.1.1 # 数据库 复制代码 ---- 1....复制代码 ---- 下面根据不同平台路径,简单封装一个 getDbDirPath 静态方法来辅助获取数据库路径。...打开数据库 由于 windows 和 linux 使用sqflite_common_ffi 所以开启数据库方式不同。...一个人把所有的东西都写了,然后工资还是那些,平白无故多干活,也是不现实。 ---- 1. 导航栏适配 先看一下导航栏如何适配,达到如下效果。桌面端由于宽度大,一般都有左侧导航。...毕竟通过写 dart 代码,编译成各平台软件,本身就是一种 奇迹 。Flutter 在桌面端已经完成了 0 到 1 质变,接下来只要累积量变,完善社区生态,未来可期。

1.6K20

Flutter 应用数据持久化指南

Flutter应用,数据持久化是一项至关重要任务,这是因为: 用户体验改善: 持久化数据可以确保用户个性化设置、历史数据、登录状态等在应用关闭或重启后得以保留,提升了用户体验。...2.2 SQLite数据库 SQLite是一种轻量级关系型数据库Flutter提供了SQLite数据库支持,可以通过dart语言sqflite库进行操作。...需要引入第三方库(如sqflite)来实现数据库操作。 2.3 文件存储(File Storage) Flutter也支持直接将数据存储到文件,可以通过dart语言File类进行文件操作。...需要引入第三方库(如sqflite)来实现数据库操作。 对于简单数据存储需求,使用SQLite可能显得过于复杂。 5....5.2 使用示例 下面是一个简单示例,演示了如何使用文件存储在Flutter应用读取和写入数据。

40010
  • Flutter 入门指北之数据持久化

    因为在例子,我们保存数据相对比较简单,所以这边就不得不说另外一种更方便持久化方式了 shared_preferences SharedPreferences 写 Android 小伙伴对这个应该不陌生了...以上代码查看 data_persistence_main.dart文件 Sqflite Flutter实现数据库存储需要通过插件 sqflite来实现,写文章时候最新版本是 sqflite 1.1.3...,但是该版本需要 flutter 1.2以上才行,所以我选择sqflite 1.1.0,小伙伴可以根据自己 flutter版本选择相应 sqflite版本。...sqflite 基本操作语句,在文档已经写得非常明白了,所以就不搬运了,这边直接讲下对于数据库一些封装处理吧,因为打开数据库是一个很消耗资源一个过程,所以呢,推荐实现单例会比较好。..._internal(); return _instance; } } 最后代码地址还是要: 文章涉及代码:demos (https://github.com/kukyxs/flutter_arts_demos_app

    1.4K10

    Flutter 凉了吗?

    除非您使用像Flutter这样SDK,这样您就将拥有一个能适配两个操作系统代码库。不仅如此,你还可以完全原生地运行它们。这意味着诸如浏览页面和导航之类东西,完美配合不同操作系统。...这只是Flutter提供小部件几个,除这些之外还有很多。使用这些小部件,我们可以构建一个非常简单UI: Flutter像一个拥有各种各样道具魔术师,使你能轻而易举地构建App主题。...可以使用库,以便你使用所选择数据库。使用sqflite库,我们可以非常快速地启动并运行SQLite数据库。...感谢单件模式,我们可以访问数据库并从几乎任何地方都可以进行查询,而无需每次都重新创建一个对象。 数据库检索数据后,可以使用一个模型将其转换为对象。...或者,如果要将对象存储在数据库,可以使用相同模型将其转换为JSON。 如果没有将其显示给用户方法,这些数据就不是那么有用了。

    3.1K20

    Flutter学习指南App, 一起来玩Flutter吧~

    Flutter是谷歌移动UI框架,可以快速在iOS、Android、Web和PC上构建高质量原生用户界面。Flutter可以与现有的代码一起工作。...在全世界,Flutter正在被越来越多开发者和组织使用,并且Flutter是完全免费、开源。同时它也是构建未来Google Fuchsia应用主要方式。...从事移动开发这么多年, 各种跨平台技术层出不穷.最初基于webphonegap/cordova到后来原生组件渲染react-native/weex,再到现在flutter通过自己开发了一套原生控件渲染...Flutter学习指南 为了能够方便大家快速学习Flutter, 我简单写了一个Flutter学习指南App,包含众多组件和插件使用, 是学习和体验flutter组件小Demo....image_picker (图片选择) sqflite (sqlite数据库) fluro (页面路由神器) flutterwebviewplugin (网页加载) flutter_spinkit (

    1.7K10

    Flutter 本地数据库sqflite实战操作「建议收藏」

    Flutter 本地数据库sqflite实战操作 通过本文章将带你了解sqflite如何使用并管理,注意要学习本功能、要具备一定sql数据库操作基础知识!...知识点: 本地化列表数据 本地化列表详情数据 sqflite 本地化数据库增删改查操作 一、安装sqflite https://pub.flutter-io.cn/packages/sqflite 二、...:path/path.dart'; import 'package:sqflite/sqflite.dart'; // 定义数据库Mock模型 final String tableName = 'step_task_table..., whereArgs:[id]); } // 关闭此表链接 Future close() async => db.close(); } 四、使用创建数据库文件 注意: 首先安装网络监听插件...res = await api.request('https://xxx.xxxx/api', formData: params); // 不为空的话,证明拿到了正常数据,将其存储到要存储数据参数

    1.6K30

    Flutter持久化存储之数据库存储(sqflite)详解

    前言 数据库存储是我们常用存储方式之一,对大批量数据有增、删、改、查操作需求时,我们就会想到使用数据库Flutter中提供了一个sqflite插件供我们用于大量数据执行CRUD操作。...本篇我们就来一起学习sqflite使用。 sqflite是一款轻量级关系型数据库,类似SQLite。 在Flutter平台我们使用sqflite库来同时支持Android 和iOS。...sqflite使用 引入插件 在pubspec.yaml文件添加path_provider插件,最新版本为1.0.0,如下: dependencies: flutter: sdk: flutter...关闭数据库 数据库对象使用完之后要在适当时候关闭掉,可在helper类实现以下方法。...= null; }); } 写在最后 以上介绍了sqflite我们常用几个操作,有了sqflite我们就可以开发更丰富应用程序,在开发实践中大家遇到任何问题都可以给我们发消息反馈,大家一起交流探讨共同进步

    3.8K40

    Flutter必备技能:轻松掌握本地存储与数据库优化技巧!

    如: 用户账号登录信息需要保存,用于每次与Web服务验证身份 下载后图片需要缓存,避免每次都要重新加载,浪费用户流量 由于Flutter仅接管渲染层,真正涉及到存储等操作系统底层行为时,还需要依托于原生...; ... readContent().then((value)=>print(value)); 除了字符串读写之外,Flutter还提供了二进制读写能力,可以支持图片、压缩包等二进制文件读写。...数据库只会创建一次,也就意味着onCreate方法在应用安装到卸载生命周期中只会执行一次。如果我们在版本升级过程,想对数据库存储字段进行改动又该如何处理呢?...考虑到用户升级顺序并不总是连续,可能会直接1.0升级到1.2,因此我们可以在onUpgrade函数,对数据库当前版本和用户手机上数据库版本进行比较,制定数据库升级方案。...Flutter提供了两类目录,即临时目录与文档目录。我们可以根据实际需求,通过写入字符串或二进制,实现数据持久化。

    85020

    Flutter 专题】26 图解关于 SQL 数据库二三事 (一)

    和尚刚刚学习一下关于数据存储方面的小知识点,用 sqflite数据库进行基本操作。sqflite 为三方 pub 通用引入方式。和尚仅对数据库基本操作进行学习整理。...集成方式 pubspec.yaml 添加 sqflite: any; 在相应 .dart 文件添加引用 import 'package:sqflite/sqflite.dart'; 根据需求对数据存储进行具体...创建数据库 sqflite 创建数据库时优先创建一个路径,用来存储数据库。注:对于数据库操作都是耗时操作,都要通过 async 和 await 异步处理。...【删】删除数据 借助 rawDelete 或 db.delete 对数据库表进行数据删除,和尚测试删除 id = 0和1 对应数据,sqflite 内部已处理好,若数据库表不存在也不会报异常...,可对部分数据字段进行调整,可以看图例【更新】结果; 在使用 db.transaction 对数据库表进行增删改查时要注意 SQL 语句完整性,包括传递 String 类型参数时要加引号,执行是一个完整

    1K51

    Flutter本地存储

    好吧,还是回归今天主题,我们还是来看下Flutter本地存储吧 Flutter本地存储 ---- 和Android、Ios类似,Flutter也支持Preferences(Shared Preferences...Preferences存储 ---- Flutter本身并不支持Preferences存储,需要借助于第三发组件来实现。...同样方法,我们需要在pubspec.yaml文件引入 sqflite: >=0.8.5 然后调用flutter packages get 最后在自己Dart文件引入 import ‘package...:sqflite/sqflite.dart’; 即可在Flutter使用Sqlite 同样,我慢还是先贴代码: 首先,我们需要获取一下我们数据库存储目录,数据库名字为name.db 然后建立库和数据表...可以看到数据库文件已经在应用目录下了,数据库文件我就不拿出来看了哈 其实,今天提到本地存储操作都是比较简单,大家可以在下面多多试一试相应操作,因为在以后应用开发过程中会用很多

    4.9K30

    Flutter开发 - 数据持久化

    数据持久化应用场景有很多。比如,用户账号登录信息需要保存,用于每次与 Web 服务验证身份;又比如,下载后图片需要缓存,避免每次都要重新加载,浪费用户流量。...3、使用Sqflite轻量数据库 SharedPrefernces 使用固然方便,但这种方式只适用于持久化少量数据场景,我们并不能用它来存储大量数据,比如文件内容(文件路径是可以)。...SQLite是一个进程内库,实现了自给自足、无服务器、零配置、事务性 SQL 数据库引擎。它是一个零配置数据库,这意味着与其他数据库不一样,您不需要在系统配置。...SQLite 事务是完全兼容 ACID ,允许多个进程或线程安全访问。 SQLite 支持 SQL92(SQL2)标准大多数查询语言功能。...SQLite 使用 ANSI-C 编写,并提供了简单和易于使用 API。

    1.6K40

    Flutter 实战】大量复杂数据持久化

    SQLite pub地址:https://pub.flutter-io.cn/packages/sqflite SQLite Github:https://github.com/tekartik/sqflite...我觉得没有必要,应用程序使用数据库和 SQL 语句相关知识都是非常基础,比如打开数据库、创建表、SQL 查询语句、更新语句、删除语句等,这些都是固定格式,固定语句记住即可。...添加依赖 SQLite 并不是 Flutter 系统自带,而是一个第三方插件,在项目的 pubspec.yaml 文件添加依赖: dependencies: sqflite: ^1.3.1...path_provider: ^1.6.11 执行命令: flutter pub get 使用 SQLite 创建数据库时候需要本地路径做为参数,所以添加path_provider 插件获取本地路径...SQLite 创建成功后会在本地创建一个 db_name.db 文件,文件目录就是初始化数据库时设置目录。

    2.2K30

    Flutter 学习路线图

    前言 Flutter越来越火,学习Flutter的人越来越多,对于刚接触Flutter的人来说最重要是如何学习Flutter,重点学习Flutter哪些内容。...了解Flutter 这是一个非常虚概念,也不必花费非常多时间去专门了解,只需在搜索引擎上搜索大概浏览下相关内容即可,这可以让你对Flutter有一个全面的、站在顶层了解,了解内容如下: Flutter...UI控件 UI控件学习是进入Flutter钥匙,因此第一个要学习就是相关UI控件,Flutter系统提供组件非常多(估计300+),难道要都要学习一遍吗?...本地数据存储 本地数据存储有如下几种方式: 文件读取、写入。 shared_preferences:通过key-value方式存放数据,适合存储简单数据,比如配置数据等。...sqflite数据库形式存储数据,适合存储大量数据。 路由管理 什么是路由?简单理解就是页面的跳转,从一个页面跳转到另一个页面。路由管理就是对这些页面跳转到管理。

    1.5K10

    Flutter完整开发实战详解(二、 快速开发实战篇)

    1、Tabbar控件实现  Tabbar 页面是常有需求,而在Flutter: Scaffold + AppBar + Tabbar + TabbarView 是 Tabbar 页面的最简单实现,但在加上...如下代码所示,通过对 Dio 简单封装即可快速网络请求,真的很简单,更多可以查 Dio 官方文档,这里就不展开了。...作为全局状态管理机,用于 Flutter 再合适不过。如果你没听说过,Don't worry,简单来说就是:它可以跨控件管理、同步State 。所以 flutter_redux 等着你征服它。  ...4、数据库   在 GSYGithubAppFlutter 数据库使用sqflite 封装,其实就是 sqlite 语法使用而已,有兴趣可以看看完整代码 DemoDb.dart 。...这里主要提供一种思路,按照 sqflite 文档提供方法,重新做了一小些修改,通过定义 Provider 操作数据库: 在 Provider 定义表名与数据库字段常量,用于创建表与字段操作; 提供数据库与数据实体之间映射

    5K30

    Flutter完整开发实战详解(二、 快速开发实战篇)

    1、Tabbar控件实现  Tabbar 页面是常有需求,而在Flutter: Scaffold + AppBar + Tabbar + TabbarView 是 Tabbar 页面的最简单实现,但在加上...如下代码所示,通过对 Dio 简单封装即可快速网络请求,真的很简单,更多可以查 Dio 官方文档,这里就不展开了。...作为全局状态管理机,用于 Flutter 再合适不过。如果你没听说过,Don't worry,简单来说就是:它可以跨控件管理、同步State 。所以 flutter_redux 等着你征服它。  ...4、数据库   在 GSYGithubAppFlutter 数据库使用sqflite 封装,其实就是 sqlite 语法使用而已,有兴趣可以看看完整代码 DemoDb.dart 。...这里主要提供一种思路,按照 sqflite 文档提供方法,重新做了一小些修改,通过定义 Provider 操作数据库: 在 Provider 定义表名与数据库字段常量,用于创建表与字段操作; 提供数据库与数据实体之间映射

    5.1K10

    检查 Flutter 应用程序是否在 Web 上运行(书籍推荐)

    Flutter开发零基础入门》  本书编写目的就是帮助零基础学习跨平台开发读者,既要学习Flutter开发技术,又要掌握解决实际问题能力,提高实际项目的开发水平,从而快速成为一名合格Flutter...,并在新项目开发拓展创新。  ...介绍Text、TextField等文本类组件,Image、CircleAvatar等图片类组件和MaterialApp组件常用属性和使用方法,并结合多个技术范例和“登录界面”“注册界面”“图片浏览器”...介绍key-value存储访问机制、File存储访问机制、数据库存储访问机制和网络数据存储访问机制工作原理和应用场景,并结合多个技术范例和“睡眠质量测试系统”“随手拍”“实验室安全测试平台”“天气预报系统...,以及shared_preferences插件实现key-value键值对存储访问数据、sqflite插件实现soLite数据库操作、HttpClient实现GET和POST请求、http和Dio插件实现网络请求方法和应用场景

    1.7K10

    Flutter 移动端架构实践:Widget-Async-Bloc-Service

    然而,在构建完成并将它们一次次重构之后,我调整出了一种在我所有项目中都能够运行完好开发体系,因此,在本文中,我将介绍一种我定义架构模式: 现有的开发模式借鉴了很多思想; 调整它们以满足实际开发.../ 登录失败,将调用代码异常重新抛出 rethrow; } finally { // 登录成功或者失败, 将loading=false交给接收器 _setIsLoading...); } catch (e) { // 向添加一个error _isLoadingController.addError(e); } finally { // 登录成功或者失败...调用下述代码可以将新Job写入数据库: Future _submit(Job job) async { try { await database.setJob(job);...当更新app本地状态(例如,将状态从一个控件传递到另一个控件)时,BLoC有更简单替代方案,这个后文再提。

    16.1K20

    基于 Flutter 定制一套快速开发框架(一)

    现在要说哪个跨平台开发框架整一个 App 速度快一些,说 Flutter 第二,大概没没有几个敢说第一,Flutter 毫无疑问,是 目前来讲比较火爆 跨平台研发框架了,Flutter 支持全部平台...网络请求:考虑使用dio包,因为它提供了更多功能,如拦截器、全局配置、FormData、请求取消等,基本覆盖了网络请求常见功能,在拦截器我们可以实现很多统一处理业务逻辑,嗯,很棒。...主题切换:打算使用FlutterThemeData来定义不同主题,结合全局状态广利,可以确保主题切换可以即时反映在应用UI上。...数据持久化:考虑持久化方案,如shared_preferences、hive、sqflite等,设计数据模型和存储API,以便于数据读取和写入,最好是统一 Storage 抽象,来屏蔽掉这些持久化细节...CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), ); }}4.布局响应式模块创建一个简单响应式布局工具类

    50220

    TI EDI 项目数据库方案开源介绍

    经过配置,这些端口可以自动将文件从一个端口移动到下一个端口,直到传入 EDI 文件被转换为SQL Server结构XML文件并写入SQL Server指定数据库,或者SQL Server指定数据库获取数据并转换为可发出...选择创建工作区选项为此示例创建一个新工作区。导入工作区然后,同一个齿轮下拉菜单,单击导入工作区。 在出现对话框,选择下载示例TI.arcflow以导入相关端口和设置。...跟踪每份文件850 采购订单要测试这部分工作功能,你可以在SQL Server数据库 order_header和order_item表写入测试数据,SQL Server自动接收数据并将显示在TI_SQLServer...860 采购订单变更要测试这部分工作功能,你可以在SQL Server数据库 ordchg_header和ordchg_item表写入测试数据,SQL Server自动接收数据并将显示在TI_SQLServer...820 付款单要测试这部分工作功能,你可以在SQL Server数据库remittance_header和remittance_item表写入测试数据,SQL Server自动接收数据并将显示在

    58040
    领券