繁体   English   中英

颤振| 如何在 SQFlite 数据库中存储登录响应

[英]Flutter | How to store login response in SQFlite database

在这里,当我成功登录时,我正在登录它会将所有信息存储在 SQFLite 数据库中。 这是我的登录响应,我不知道如何在 flutter SQFlite 中存储字符串数组和 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;
  }
}

这是User模型类:

class User {
  final String user;
  final String token;

  User(this.user, this.token);

  // here because of user object is too long Im storing it as string
  // and that is actually not a good way to do this because of when you want to
  // fetch user and handle information it will be very hard to do those and also when testing
  // please map other properties in your json to model and that's the best way.
  User.fromJson(dynamic obj)
      : this.user = obj['user'].toString(),
        this.token = obj['token'];

  String get getUser => user;
  String get getToken => token;

  Map<String, dynamic> toMap() => {'user': user, 'token': token};
}

在这里,我创建了一个简单的小部件树来向您展示。 如何存储检索到的 json 对象属性。 请注意,我将 json user对象存储为String因为它很长。 最好为所有变量创建模型并映射它们。 请参阅User类中的注释。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM