android - Firebase 数据库 - 如果每个值都有一个随机生成的键,我如何在推送到数据库之前确保值的唯一性
问题描述
我正在使用 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
}
}
}
推荐阅读
- configuration - 用于创建配置文件的问卷调查工具
- r - 将稀疏邻接列表转换为 R 中的完整矩阵
- python - 如何找出另一个键:值对是否存在于 Python 的字典中?
- python-3.x - 将列表放入 csv 并将 csv 放入列表
- sql-server - SQL Server - Try-Catch / xact_abort off 和 xact_state
- react-router - Mobx 6 observable 无法与 mobx-router5 一起正常工作
- css - 响应式图像网格会导致小数像素,这会使图像无法容纳在一行中
- javascript - 当分数变为 200 时结束 p5js 游戏
- html - Angular:在空的情况下在DOM中不显示任何内容
- java - 条件注释不会被触发