如何将扫描仪中的数据存储到Firebase Firestore



我有一个Firebase,Firestore项目,它扫描二维码并将扫描的数据上传到Firebase Firestore。我想在Firestore中存储以前扫描过的二维码的历史记录,但每当我扫描新的二维码时,数据都会被最近扫描的二维码取代。我认为数据不断被替换,因为在我的情况下,字段名(ScanneItem(没有更改,而是更新了值。

如何以每次扫描新的二维码时都会生成一个新字段的方式存储数据。

我是个新手,请帮帮我。

扫描方法和Firebase Firestore存储的代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_statusbarcolor_ns/flutter_statusbarcolor_ns.dart';
import 'package:barcode_scan_fix/barcode_scan.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:user_details/DrawerPages/AboutInfo.dart';
import 'package:user_details/DrawerPages/Cards.dart';
import 'package:user_details/DrawerPages/Profile.dart';
import 'package:user_details/DrawerPages/Transactions.dart';
import 'package:user_details/fromJP/Payment_page.dart';
import 'button_widget.dart';
class Scan_QR extends StatefulWidget {
@override
_Scan_QRState createState() => _Scan_QRState();
}
class _Scan_QRState extends State<Scan_QR> {
String qrCode = "";
String Username = FirebaseAuth.instance.currentUser.displayName;
String Email = FirebaseAuth.instance.currentUser.email;
@override
Widget build(BuildContext context) {
FlutterStatusbarcolor.setStatusBarColor(Colors.amber);
return Scaffold(
appBar: AppBar(
title: Text("Scan QR Code"),
),
body: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("lib/bg.jpg"), fit: BoxFit.cover)),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
margin: EdgeInsets.fromLTRB(0, 0, 0, 0),
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(20))),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ButtonWidget(
text: "Press to Scan QR Code",
onClicked: () async {
scanqr1();
},
),
])),
]))));
}
Future scanqr1() async {
final qrCode = await BarcodeScanner.scan();
setState(() {
this.qrCode = qrCode.toString();
});
if (qrCode.isNotEmpty) {
showDialog(
context: context,
builder: (BuildContext context) => _buildPopupDialog(context));
}
}
Widget _buildPopupDialog(BuildContext context) {
return AlertDialog(
buttonPadding: EdgeInsets.all(15),
scrollable: true,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
title: Text(
"You Scanned the Following Product:",
style: TextStyle(color: Colors.amber, fontSize: 23),
),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
qrCode,
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500),
),
],
),
actions: <Widget>[
GestureDetector(
onTap: scanqr1,
child: Text(
"Re-Scan",
style: TextStyle(fontSize: 20, color: Colors.amber),
),
),
GestureDetector(
onTap: () {
Map<String, dynamic> scaneditem = {
"ScannedItem": qrCode.toString(),
"Created On": FieldValue.serverTimestamp()
};
FirebaseFirestore.instance
.collection("product")
.doc(FirebaseAuth.instance.currentUser.uid)
.set(scaneditem);
print(scaneditem);
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => Payment_page()));
},
child: Text("upload",
style: TextStyle(fontSize: 20, color: Colors.amber)),
)
]);
}
}

这是因为您在一个文档上设置数据,或者换句话说,您正在覆盖数据。你必须在每个数据上添加一个新的文档来存储以前的历史

FirebaseFirestore.instance
.collection("product")
.doc(FirebaseAuth.instance.currentUser.uid)
.collection("scannedItems")
.add(scaneditem);

这将添加一个随机的文档id,它将像这个

product
-> uid(doc)
-> scannedItems (col)
-> unique doc id (doc)
-> ur scanned data (doc data)

然后您可以通过QuerySnapshot检索它。我希望现在已经清楚了

或者您可以将userId存储在扫描的项目中,这样您就可以直接查询文档首先,在数据本身中添加用户id

Map<String, dynamic> scaneditem = {
"ScannedItem": qrCode.toString(),
"Created On": FieldValue.serverTimestamp(),
"user_id":id,
};
FirebaseFirestore.instance
.collection("product")
.add(scaneditem);

现在你有

product
-> unique doc id (doc)
-> ur scanned data (doc data along with userid)

你可以像一样得到它

FirebaseFirestore.instance
.collection("product").where("user_id",isEqualTo:"id").get();

firestore是一个nosqldb,您需要为每次扫描创建新的文档。.doc(FirebaseAuth.instance.currentUser.uid)意味着它将始终为文档使用此id。你可以让firebase生成id并保存每个扫描文档的用户id

Map<String, dynamic> scaneditem = {
"ScannedItem": qrCode.toString(),
"Created On": FieldValue.serverTimestamp(),
"uid":FirebaseAuth.instance.currentUser.uid.toString()
};
DocumentReference documentReference = FirebaseFirestore.instance
.collection("product")
.doc()
.add(scaneditem);
print(scaneditem);
//to get doc id you just uploaded 
String docId = documentReference.documentID;

//您可以更新您的文档以添加id

Firestore.instance
.collection("product")
.document(docId)
.updateData({ ..yyour data })...

最新更新