这是我的主要问题
firestore ordertBy()查询使应用程序无法在首次请求中获取数据
在这种情况下,简单说明一下:
在正常工作的智能手机上安装APP之后,我可以添加数据并读取该数据列表。
但是在我卸载并重新安装我的应用程序之后,无法访问该数据
从查询中删除orderBy()后,我的应用程序正常运行。
请问有人可以帮助我解决该问题吗?我需要订购数据列表
这是StreamBuilder的代码
StreamBuilder(
stream: Firestore.instance
.collection('murid ' + widget.email)
.where('kelas', isEqualTo: widget.kelas)
.where('emailGuru', isEqualTo: widget.email).orderBy('no')
.snapshots(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) {
return new Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 15.0,
width: 15.0,
child: CircularProgressIndicator(
strokeWidth: 1,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Loading ...',
style: TextStyle(fontSize: 18.0),
),
),
],
),
Text(
'Data belum tersedia!',
textAlign: TextAlign.center,
),
],
),
);
} else {
return Stack(
children: <Widget>[
Container(
height: 55.0,
color: Colors.blue[900],
),
Padding(
padding: const EdgeInsets.only(top: 25.0),
child: Container(
decoration: BoxDecoration(
color: Color.fromRGBO(227, 242, 253, 1.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.0),
topRight: Radius.circular(30.0)),
),
child: Stack(
children: <Widget>[
Center(
child: Text(
"Pilih Akun",
style: TextStyle(
fontSize: 40.0,
fontWeight: FontWeight.bold,
color: Colors.white54),
),
),
DataMurid(
document: snapshot.data.documents,
),
],
),
),
),
],
);
}
},
),
这是listView.builder
ListView.builder(
itemCount: widget.document.length,
itemBuilder: (BuildContext context, int i) {
String no = widget.document[i].data['no'].toString();
return Container(
key: new Key(widget.document[i].documentID),
child: Padding(
padding: const EdgeInsets.only(left: 20.0, right: 20.0),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Container(
height: 40.0,
decoration: BoxDecoration(
color: Colors.blue[900],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(300.0),
bottomLeft: Radius.circular(300.0),
topRight: Radius.circular(30.0),
bottomRight: Radius.circular(30.0)),
),
child: Center(
child: Text(
no,
style: TextStyle(
fontSize: 14.0,
fontWeight: FontWeight.bold,
color: Colors.white),
),
),
),
),
我需要订购该数字,因为列表视图使该数字值转换为字符串,如果数字大于9,则转换为结果,例如:
我的值'no'是[1,2,3,4,5,6,7,8,9,10,11,12],在我将该值调用给ListView之后,输出将如下所示:
1、10、11、12、2、3、4、5、6、7、8、9 //不带orderBy();
答案 0 :(得分:0)
从结果中您可以得到,好像您将数字作为字符串值存储在数据库中一样。
对于字符串值,Firestore将使用字典顺序,这意味着它将按照对文本进行排序的方式进行排序。假设您有以下文字:"ba"
,"b"
,"c"
,“ ca"
。您希望它们按以下方式排序:
"b"
"ba"
"c"
"ca"
当处理存储在字符串中的数字时,数据库遵循完全相同的逻辑。所以:
"1"
"10"
"11"
"2"
"21"
"3"
这可能不是您想要的,但是在数据库运行的级别上完全可以预期。
有两种常见的解决方案:
将这些值作为实际数字值存储在数据库中。到目前为止,这是最简单的,在这种情况下,数据将按数字顺序而不是按字典顺序排列。
确保所有字符串值的长度相同。如果您用零或空格“填充”字符串以使它们的长度相同,那么字典顺序将再次起作用:
"01"
"02"
"03"
"10"
"11"
"21"