flutter - 颤振 | 如何在 SQFlite 数据库中存储登录响应
问题描述
在这里,当我成功登录时,我正在登录它会将所有信息存储在 SQFLite 数据库中。这是我的登录响应,我不知道如何在颤振 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 对象属性。请注意,我存储 jsonuser
对象是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());
},
);
}
}
推荐阅读
- open-policy-agent - OPA 冲突政策
- javascript - 没有为 React App 加载 CSS 模块
- android - Dose android 提供跨多个应用程序的订阅?
- javascript - 在饼图 Highcharts 中显示数据表边框
- python - Gekko 优化
- amazon-s3 - 为 Amazon S3 存储桶键创建索引
- https - A帧的未来,https?
- python - 调试强化学习模型 (MsPacman)
- html - 单击时将标签内的字符串插入其他代码行
- javascript - Google Web 应用程序 - 从默认 html 文件生成另一个 html 并将值从默认 html 传递到新 html