【问题标题】:Firebase real-time database check with two value?Firebase实时数据库检查有两个值?
【发布时间】:2020-04-21 13:49:46
【问题描述】:

我需要用两个值检查一条记录是否已经存在,以避免重复记录。我的数据库结构如下:

movielist
         movies
              -M5RwyBsC1cwTzX4LU-A
               backdropPath: "https://image.tmdb.org/t/p/original/5BwqwxMEjeF..."
               genres: "Science Fiction, Drama"
               imDBid: "tt2935510"
               posterPath: "https://image.tmdb.org/t/p/original/xBHvZcjRiWy..."
               releaseDate: "2019"
               title: "Ad Astra"
               userId: "SZ7zU6toVcSSablbnZif8n4MTIb2"
               voteAverage: "6.6"
               watched: false

所以我需要在添加之前检查具有 userId 的用户和具有 imDBid 的电影是否存在。如果有更有效的方法可以做到这一点,您也可以建议任何类型的 db 结构。

更新代码(已编辑):

    final dbRef = FirebaseDatabase.instance.reference().child("movies");

    ...
    FutureBuilder(
           future: getData(_name),
           builder: (context, snapshot) {
    .....

             floatingActionButton: FutureBuilder(
                          future: dbRef.orderByChild("imDBid").equalTo(snapshot.data.imdbId).once(),
                          builder: (context, snapshots) {
                          return FloatingActionButton(
                             backgroundColor: Colors.red.withOpacity(0.4),
                             onPressed: (){
                             Movies movies = new Movies(snapshot.data.imdbId, snapshot.data.originalTitle, snapshot.data.posterPath, snapshot.data.backdropPath, snapshot.data.releaseDate, snapshot.data.title, snapshot.data.voteAverage, snapshot.data.genres, false, userId);
                            _database.reference().child("movies").push().set(movies.toJson());},

                           child: Icon(snapshots.data.value != null ? Icons.favorite : Icons.favorite_border )
      )
   }
),

【问题讨论】:

    标签: firebase flutter dart firebase-realtime-database


    【解决方案1】:

    由于您使用的是 firebase 实时数据库,因此唯一的方法是将两个属性合并为一个。

    所以你将拥有以下内容:

    movies
      randomid
        userId_imbdId  : valueId_valueId
    

    然后你可以检查userId_imbdId是否等于userId_movieid

    【讨论】:

    • 这是制作唯一键的实用方法,但我在我的 ui 中使用数据,也许我保持我的 user_id 原样并修改你提到的 imdbId 值,以便这个值可以使用一些字符串操作拆分或 .replaceAll(userId, "") 的东西。还有一个问题,这个查询如何避免重复记录?
    • 你可以添加这个属性并保留另外两个。为防止重复,您需要使用查询示例:orderByChild("userId_imbdId").equalTo(valueId_valueId) 然后如果您获取数据则表示它存在,如果您没有获取数据则表示它不存在
    • 谢谢,但我想它永远不会为空,我试过了( print(FirebaseDatabase.instance.reference().orderByChild("imDBid").equalTo("any id") != null) 和它即使添加或不添加 id 也返回 true。我想我需要对此进行更多研究。我的主要问题是我的主页列出了来自 db 的所有电影属于 userid 但是当我转到从另一个构建自身的详细信息页面时未来功能,我无法以某种方式连接两者。我试图在我的“添加到”按钮上创建一个子未来构建器,以控制它的图标形状和按下操作,但还无法实现。与本地数据库逻辑如此不同。
    • petercoding.com/firebase/2020/02/16/… 你需要使用once() 来返回一个未来
    • 我正在阅读这篇文章,它非常有用,谢谢,如果我不打扰你,你能检查我问题中的编辑部分吗?据我了解,当我这样做时,如果来自第一个未来的 snapshot.data.imdbid 不等于数据库“imDBid”子项的任何记录,那么(第二个未来的)快照必须为空,但是当我尝试更新代码时我添加到我的问题图标永远不会随着 if else 情况而改变。只是想了解我使用更改图标的逻辑,如果我可以更改图标,我可以根据此数据更改 onpressed 操作,以避免重复记录。
    【解决方案2】:

    您可以将 2 个 where 子句链接在一起。

    Firestore.instance.collection("movies)
         .where("userId", isEqualTo: "Some user Id")
         .where("imDBid isEqualTo: "Some imDBid")
    

    【讨论】:

    • 我正在使用 firebase auth 和实时数据库,所以我没有在任何地方实现 firestore,我使用 FirebaseDatabase.instance 进行了尝试,但它没有集合或我认为的位置。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2017-10-06
    相关资源
    最近更新 更多