Flutter flatter |如何在SQFlite数据库中存储登录响应

Flutter flatter |如何在SQFlite数据库中存储登录响应,flutter,dart,flutter-layout,flutter-dependencies,sqflite,Flutter,Dart,Flutter Layout,Flutter Dependencies,Sqflite,在这里,我做登录,当我成功登录时,它会将所有信息存储在SQFLite数据库中。 这是我的登录响应,我不知道如何在flattersqflite中存储字符串数组和JSON。我需要将所有这些响应信息存储在SQFLite中 有人能帮我根据这个响应创建一个表吗 { "loginUser": { "token": "eyJhbGciOiZTMzLTQ4NmItYmFhNS0wODRhMWI2Nzg3YjQiJhY2Nlc3MifQ.bLKz-y9W6VKXRXkG6fbxlrmcowRNupKL

在这里,我做登录,当我成功登录时,它会将所有信息存储在SQFLite数据库中。 这是我的登录响应,我不知道如何在flattersqflite中存储字符串数组和JSON。我需要将所有这些响应信息存储在SQFLite中

有人能帮我根据这个响应创建一个表吗

{
  "loginUser": {
    "token": "eyJhbGciOiZTMzLTQ4NmItYmFhNS0wODRhMWI2Nzg3YjQiJhY2Nlc3MifQ.bLKz-y9W6VKXRXkG6fbxlrmcowRNupKL0g",
    "user": {
      "aclRoleId": [
        "cmr",
        "bsp"
      ],
      "confirmationSentAt": "2019-12-30T09:12:08Z",
      "confirmationToken": "$argon2id$v=19$m=131072,t=8,p=4$WQoFfhBUfabw7g1BgNuuxg$BmUEYNWTZHeCnY0xCqOT+nWEDNlXcrNIEWQZkA51oCk",
      "confirmedAt": null,
      "country": {
        "capital": "New Delhi",
        "code": "IND",
        "contactInfo": null,
        "currencyCode": "INR",
        "currencySymbol": "₹",
        "id": "3",
        "isdCode": "+91",
        "name": "India",
        "officialName": "The Republic of India"
      },
      "currentSignInAt": null,
      "email": "john@mailinator.com",
      "failedAttempts": null,
      "id": "1",
      "language": {
        "code": "EN",
        "id": "1",
        "isActive": true,
        "name": "English"
      },
      "lockedAt": null,
      "meta": null,
      "mobile": "(999)-000-0040",
      "profile": {
        "first_name": "John",
        "last_name": "Doe"
      },
      "resetPasswordSentAt": null,
      "resetPasswordToken": null,
      "scopes": null,
      "signInCount": 12,
      "statusId": "confirmed",
      "token": null,
      "unlockToken": null
    }
  }
}

以下是一种方法:

import 'dart:io';
import 'package:path/path.dart';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
import 'package:utility_demos/user_management/user.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = new DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

  static Database _db;

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDb();
    return _db;
  }

  DatabaseHelper.internal();

  // create database
  initDb() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentDirectory.path, "main.db");
    var ourDb = await openDatabase(path, version: 1, onCreate: _onCreate);
    return ourDb;
  }

  // create tables
  void _onCreate(Database db, int version) async {
    await db.execute(
        "CREATE TABLE User(uid INTEGER AUTO INCREMENT PRIMARY KEY, token TEXT, user TEXT)");
    // note that Im inserting password as plain text. When you implement please store it as a hash for security purposes.
  }

  // insert user to db when login
  Future<int> saveUser(User user) async {
    Database dbClient = await db;
    int res = await dbClient.insert("User", user.toMap());
    return res;
  }

  // retrieve user from db
  Future<User> getUser() async {
    var dbClient = await db;
    List<Map> list = await dbClient.rawQuery('SELECT * FROM User');
    if (list.isNotEmpty) {
      return User.fromJson(list.elementAt(0));
    }
    return null;
  }

  //delete use when logout
  Future<int> deleteUser() async {
    var dbClient = await db;
    int res = await dbClient.delete("User");
    return res;
  }

  // check if the user logged in when app launch or any other place
  Future<bool> isLoggedIn() async {
    var dbClient = await db;
    var res = await dbClient.query("User");
    return res.length > 0 ? true : false;
  }
}
在这里,我创建了一个简单的小部件树来向您展示。如何存储检索到的json对象属性。请注意,我将json
user
对象存储为
String
,因为它相当长。最好为所有变量创建模型并映射它们。请参见
User
class中的注释

import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:utility_demos/user_management/database_helper.dart';
import 'package:utility_demos/user_management/user.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SO answers sample snippet',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  Future<bool> doLogin() async {
    String data = await DefaultAssetBundle.of(context).loadString("assets/login_mock_data.json");
    final decoded = json.decode(data);
    try {
      if (decoded != null) {
        final user = User.fromJson(decoded["loginUser"]);
        DatabaseHelper dbHelper = new DatabaseHelper();
        await dbHelper.saveUser(user);
        return true;
      }
    } catch (e) {
      debugPrint(e.toString());
    }
    return false;
  }

  // just to show you how to fetch from db
  Future<String> getLoggedInUser() async {
    bool isLoggedIn = await doLogin();
    if (isLoggedIn) {
      User user = await DatabaseHelper().getUser();
      return user.getToken;
    }
    return null;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: getLoggedInUser(),// this is also not a good practice :D, since each and every time build method execute this will invoke too.
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasError) {
          return Center(child: Text("Something..."));
        } else if (snapshot.hasData) {
          // just to show you how to fetch from db
          if (snapshot.data != null) {
            return Center(child: Text("Logged in token: ${snapshot.data}"));
          }
          return Center(child: Text("Not logged in"));
        }
        return Center(child: CircularProgressIndicator());
      },
    );
  }
}
导入'dart:convert';
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“package:utility_demos/user_management/database_helper.dart”;
导入“包:实用工具\演示/user\管理/user.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振如此回答样本片段”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:主页(),
);
}
}
类主页扩展了StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
Future doLogin()异步{
String data=await DefaultAssetBundle.of(context).loadString(“assets/login_mock_data.json”);
最终解码=json.decode(数据);
试一试{
如果(已解码!=null){
最终用户=user.fromJson(已解码[“loginUser”]);
DatabaseHelper dbHelper=新的DatabaseHelper();
wait dbHelper.saveUser(用户);
返回true;
}
}捕获(e){
debugPrint(例如toString());
}
返回false;
}
//只是为了向您展示如何从数据库获取数据
Future getLoggedInUser()异步{
bool isLoggedIn=等待多洛金();
如果(isLoggedIn){
User User=wait DatabaseHelper().getUser();
返回user.getToken;
}
返回null;
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:getLoggedInUser(),//这也不是一个好的实践:D,因为每次构建方法执行它时都会调用它。
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
返回中心(子:文本(“某物…”);
}else if(snapshot.hasData){
//只是为了向您展示如何从数据库获取数据
如果(snapshot.data!=null){
返回中心(子项:文本(“登录令牌:${snapshot.data}”);
}
返回中心(子项:文本(“未登录”);
}
返回中心(子项:CircularProgressIndicator());
},
);
}
}

这里有一种方法:

import 'dart:io';
import 'package:path/path.dart';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
import 'package:utility_demos/user_management/user.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = new DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

  static Database _db;

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDb();
    return _db;
  }

  DatabaseHelper.internal();

  // create database
  initDb() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentDirectory.path, "main.db");
    var ourDb = await openDatabase(path, version: 1, onCreate: _onCreate);
    return ourDb;
  }

  // create tables
  void _onCreate(Database db, int version) async {
    await db.execute(
        "CREATE TABLE User(uid INTEGER AUTO INCREMENT PRIMARY KEY, token TEXT, user TEXT)");
    // note that Im inserting password as plain text. When you implement please store it as a hash for security purposes.
  }

  // insert user to db when login
  Future<int> saveUser(User user) async {
    Database dbClient = await db;
    int res = await dbClient.insert("User", user.toMap());
    return res;
  }

  // retrieve user from db
  Future<User> getUser() async {
    var dbClient = await db;
    List<Map> list = await dbClient.rawQuery('SELECT * FROM User');
    if (list.isNotEmpty) {
      return User.fromJson(list.elementAt(0));
    }
    return null;
  }

  //delete use when logout
  Future<int> deleteUser() async {
    var dbClient = await db;
    int res = await dbClient.delete("User");
    return res;
  }

  // check if the user logged in when app launch or any other place
  Future<bool> isLoggedIn() async {
    var dbClient = await db;
    var res = await dbClient.query("User");
    return res.length > 0 ? true : false;
  }
}
在这里,我创建了一个简单的小部件树来向您展示。如何存储检索到的json对象属性。请注意,我将json
user
对象存储为
String
,因为它相当长。最好为所有变量创建模型并映射它们。请参见
User
class中的注释

import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:utility_demos/user_management/database_helper.dart';
import 'package:utility_demos/user_management/user.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SO answers sample snippet',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  Future<bool> doLogin() async {
    String data = await DefaultAssetBundle.of(context).loadString("assets/login_mock_data.json");
    final decoded = json.decode(data);
    try {
      if (decoded != null) {
        final user = User.fromJson(decoded["loginUser"]);
        DatabaseHelper dbHelper = new DatabaseHelper();
        await dbHelper.saveUser(user);
        return true;
      }
    } catch (e) {
      debugPrint(e.toString());
    }
    return false;
  }

  // just to show you how to fetch from db
  Future<String> getLoggedInUser() async {
    bool isLoggedIn = await doLogin();
    if (isLoggedIn) {
      User user = await DatabaseHelper().getUser();
      return user.getToken;
    }
    return null;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: getLoggedInUser(),// this is also not a good practice :D, since each and every time build method execute this will invoke too.
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasError) {
          return Center(child: Text("Something..."));
        } else if (snapshot.hasData) {
          // just to show you how to fetch from db
          if (snapshot.data != null) {
            return Center(child: Text("Logged in token: ${snapshot.data}"));
          }
          return Center(child: Text("Not logged in"));
        }
        return Center(child: CircularProgressIndicator());
      },
    );
  }
}
导入'dart:convert';
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“package:utility_demos/user_management/database_helper.dart”;
导入“包:实用工具\演示/user\管理/user.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振如此回答样本片段”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:主页(),
);
}
}
类主页扩展了StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
Future doLogin()异步{
String data=await DefaultAssetBundle.of(context).loadString(“assets/login_mock_data.json”);
最终解码=json.decode(数据);
试一试{
如果(已解码!=null){
最终用户=user.fromJson(已解码[“loginUser”]);
DatabaseHelper dbHelper=新的DatabaseHelper();
wait dbHelper.saveUser(用户);
返回true;
}
}捕获(e){
debugPrint(例如toString());
}
返回false;
}
//只是为了向您展示如何从数据库获取数据
Future getLoggedInUser()异步{
bool isLoggedIn=等待多洛金();
如果(isLoggedIn){
User User=wait DatabaseHelper().getUser();
返回user.getToken;
}
返回null;
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:getLoggedInUser(),//这也不是一个好的实践:D,因为每次构建方法执行它时都会调用它。
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
返回中心(子:文本(“某物…”);
}else if(snapshot.hasData){
//只是为了向您展示如何从数据库获取数据
如果(snapshot.data!=null){
返回中心(子项:文本(“登录令牌:${snapshot.data}”);
}
返回中心(子项:文本(“未登录”);
}
返回中心(子项:CircularProgressIndicator());
},
);
}
}

我已经完成了这部分。但我想知道如何创建此响应的表。@RutvikGumasana wait我正在更新answer@RutvikGumasana我更新了答案,请查收。我还没有测试它,所以在这里您已经创建了一个用户表。所以如果我在模型中有很多文件,就像你说的,我已经创建了这个模型。我必须添加所有字段以创建表,否则它将自动创建表。我可以与您共享我的代码吗?你能帮我一下吗。你的小小帮助可以让我开心。我已经完成了这部分。但我想知道如何创建此响应的表。@RutvikGumasana等待im更新