Firebase 数据库 - 如果每个值都有一个随机生成的密钥,我如何在推送到数据库之前确保值的唯一性

讨价还价23

我正在使用 Android SDK 将设备令牌写入我的 Firebase 数据库。我将这些令牌与用户相关联。我假设每个用户可能有一个或多个设备。因此,这就是我当前的数据库结构的样子:

{
  "users" : {
    "1" : {
      "-LAwu8VKATAxifCOZIPn" : "Device_Token_For_User_1",
      "-LAwyfXcoLcXBX3rOshb" : "Device_Token_For_User_1"
    },
    "8" : {
      "-LAwuR9cel-p0kXv-LCn" : "Device_Token_For_User_8"
    }
  }
}

如您所见,用户 1(由键“1”表示)包含已写入两次但使用不同键(左侧)的相同标记。由于该push()方法,这些密钥是随机生成的我实际上只关心值本身,但我想避免将相同的令牌多次写入特定用户。

我通过这种方式将令牌推送到我的数据库到 Firebase 数据库中:

String token = FirebaseInstanceId.getInstance().getToken();
Person currentUser;
try {
    currentUser = Reservoir.get("current_user", Person.class);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference();
    myRef.child("users").child(Integer.toString(currentUser.id)).push().setValue(token);
} catch (IOException e) {
    Log.e("ERROR", "Cannot fetch user from reservoir.");
    Toast.makeText(getApplicationContext(), "An unexpected error occurred.", Toast.LENGTH_SHORT).show();
    e.printStackTrace();
}

一切都很好,除了当用户注销并重新登录到同一设备时,相同的令牌将被推送两次到数据库,这就是用户 1 的情况。

安德烈·库尔

您可以将其用作键,而不是使用令牌作为值,以确保它是唯一的,并为其提供一个任意值,例如 true。

您必须像这样更改代码:

myRef.child("users").child(Integer.toString(currentUser.id)).child(token).setValue(true);

这将导致以下数据库:

{
  "users" : {
    "1" : {
      "Device_Token_For_User_1" : true,
      "SecondDevice_Token_For_User_1" : true
    },
    "8" : {
      "Device_Token_For_User_8" : true
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档