Flutter flatter |如何在SQFlite数据库中存储登录响应
在这里,我做登录,当我成功登录时,它会将所有信息存储在SQFLite数据库中。 这是我的登录响应,我不知道如何在flattersqflite中存储字符串数组和JSON。我需要将所有这些响应信息存储在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
{
"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对象属性。请注意,我将jsonuser
对象存储为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对象属性。请注意,我将jsonuser
对象存储为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更新