从 Cloud Firestore 查询日期并运行两个单独的查询

Posted

技术标签:

【中文标题】从 Cloud Firestore 查询日期并运行两个单独的查询【英文标题】:Query Date from Cloud Firestore and run two separate queries 【发布时间】:2021-03-04 19:22:34 【问题描述】:

经过 2 天的持续研究、测试和尝试 - 我正在寻求一些急需的帮助!

我正在查询 Firestore 集合并返回与查询匹配的条目(只会有零或一个结果),其中 UserId 字段与登录的 uid 匹配。这工作正常。下一步是在此返回上检查日期输入字段,它是集合中的时间戳,并将其与当前的日期和时间进行比较。

然后我需要更进一步并运行第二个查询,本质上是:

如果有记录匹配且日期字段为 => 现在,则显示 x; 如果有记录匹配且日期字段 >= 现在,则显示 y; 否则如果没有记录匹配,则显示z;

我无法弄清楚错误消息是什么,以及如何最好地检查查询后的日期以查看它是过去(并显示 x)还是将来(并显示 y)?

以下代码在android Studio中没有报错,应用可以运行,但是控制台报错:

Class 'DateTime' has no instance method 'Timestamp'.
Receiver: Instance of 'DateTime'
Tried calling: compareto(Instance of 'DateTime')

代码是:

StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection('collectionDatabase')
      .where('uid', isEqualTo: _auth.currentUser.uid)
      .snapshots(),
          builder: (context, snapshot) 
             List<Widget> statusExample = [];
                if (snapshot.hasData) 
                  final cover = snapshot.data.docs;
                  for (var coverIn in cover) 
                    final singleDate = coverIn.data()['endDate'].toDate();
                    final endDate = coverIn.data()['endDate']
                    .toDate()
                    .toString()
                    .substring(0, 10);
                       var dateNow = DateTime.now();
                       final getEndDate = Text('$endDate');
                       final expiredEndDate = Text('No!');
                          if (singleDate.compareto(dateNow) > 0)  // this line of code is incorrect - the corrected version of this line is below....
                             var statusExample = getEndDate;
                             return StatusDateNow;
                           else 
                             var statusExample = expiredDate;
                             return StatusDateNow;
                          
                                   
                     
               
                       return Column(children: StatusDateNow);
          ),

更新

我已经设法使用 flutter.dev 找到了解决方案 - 标准和最佳实践解决方案似乎是使用 'isAfter' 或 'isBefore' 而不是 '.compareto'

我将以下 sn-p 代码更改为以下代码,它可以工作:

if (singleDate.isAfter(dateNow) == true)   

【问题讨论】:

我已经设法找到了在这种情况下有效的答案 - 所以我将保留它,并为上面的问题添加更新 - 以防其他人有同样的问题 嗨!感谢您的贡献。我认为将您的解决方案发布为答案并将其标记为正确可能是一个好主意,以便其他人更清楚。提前致谢! 我已经添加了一个答案 - 但似乎没有选项可以将答案标记为正确,或将问题标记为完整? 【参考方案1】:

我已经设法使用 flutter.dev 找到了解决方案 - 标准和最佳实践解决方案似乎是使用 'isAfter' 或 'isBefore' 而不是 '.compareto'

我将以下 sn-p 代码更改为以下代码,它可以工作:

if (singleDate.isAfter(dateNow) == true)   

【讨论】:

以上是关于从 Cloud Firestore 查询日期并运行两个单独的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从Swift中的Cloud FireStore Firebase访问特定字段

Flutter cloud_firestore 系统日期对象的设置/警告

如何将数据从 Cloud Firestore 导入到本地模拟器?

如何在 Cloud Firestore 中使用文档 ID 执行集合组查询

Cloud Firestore 等效于 AppEngine/Datastore Memcache 和仅键查询?

Cloud Firestore 使用查询进行不区分大小写的排序