Android 上的 Firebase 查询有限键

问题描述 投票:0回答:1

我们有一个 Firebase 表,其中有一个名为“guest”的游戏用户表。它有一个带有 JSON 键的用户列表,例如。

reference.Child("guest").OrderByChild("level").LimitToLast(100);
得到

  "01e3ab2017b39a3809d7ac69aedd0957": {
    "GuestUserProfileIndex": 0,
    "MappingId": "01e3ab2017b39a3809d7ac69aedd0957",
    "XP": 55395,
    "coin": 32132400,
    "first_Name": "GUEST",
    "isOnline": false,
    "isPlaying": false,
    "isRewardedVideoSpin": false,
    "lastDailyBonusTimeStamp": -8585100376467717008,
    "lastSpinTimeStamp": 0,
    "level": 12,
    "name": "Masood khan",
    "oldLevel": 12,
    "profileURL": "",
    "purchasableStriker": {
      "selectIndex": 0,
      "strikerPurchase": [
        0
      ]
    },
    "referredUser": "",
    "removeAds": false,
    "rewardedVideoSpinCount": 3,
    "timeStamp": -8584945728384719228,
    "totalLinkedReferalUser": 0,
    "totalLosserLevel": 92,
    "totalWinnerLevel": 847,
    "unlimitedFree2xSpin": false,
    "unlimitedFreeSpin": false,
    "userId": "01e3ab2017b39a3809d7ac69aedd0957",
    "winningCoin": 72828300,
    "winningCoinByReferral": 0
  },
  "03eeb04d6063f39c5c8246ffe5f97848": {
    "GuestUserProfileIndex": 9,
    "MappingId": "03eeb04d6063f39c5c8246ffe5f97848",
    "XP": 104145,
    "coin": 65512844,
    "countryCode": "IN",
    "first_Name": "GUEST",
    "isOnline": false,
    "isPlaying": false,
    "isRewardedVideoSpin": false,
    "lastDailyBonusTimeStamp": -8584959351,
    "level": 10,
    "name": "Ravi",
  }
}

但是当想要显示排行榜来对用户进行排名时,我们只想从该表中获取最少的数据,而不是所有键。

例如仅此;

{
  "01e3ab2017b39a3809d7ac69aedd0957": {
    "level": 12,
    "name": "Masood khan",
  },
  "03eeb04d6063f39c5c8246ffe5f97848": {
    "level": 10,
    "name": "Ravi",
  }
}

因此我们可以节省不需要的数据的数据传输

android firebase firebase-realtime-database
1个回答
0
投票

将侦听器附加到节点时,您会下载该节点中存在的所有数据。这意味着,如果您的查询返回

Guest
对象,那么您将读取/下载这些节点内的所有数据。您确实可以从
snapshot
对象中仅选择您感兴趣的字段,但这并不意味着您没有下载整个节点。

如果您需要使用以下查询:

reference.Child("guest").OrderByChild("level").LimitToLast(100);

并且仅获取以下字段:

{
  "01e3ab2017b39a3809d7ac69aedd0957": {
    "level": 12,
    "name": "Masood khan",
  },
  "03eeb04d6063f39c5c8246ffe5f97848": {
    "level": 10,
    "name": "Ravi",
  }
}

那么你应该考虑对数据进行非规范化。这意味着您应该复制您感兴趣的数据,即另一个节点中的

level
name
字段,并查询该节点而不是原始节点。这样,您只会获得两个字段,而不是 30 个。因此您将节省大量带宽和资源。

如果您不熟悉 NoSQL 数据库,这可能听起来有点奇怪,但实际上这是一种很常见的做法。

© www.soinside.com 2019 - 2024. All rights reserved.