这就是我想要的结果:
{
"data" : {
"account" : {
"K1472290187836" : {
"created" : 1472290190043,
"id" : "K1472290187836"
}
},
"auth" : {
"d182ddec-f1c7-41c5-8b0e-198bfb5d9efe" : {
"account_id" : "K1472290187836",
"active" : true,
"created" : 1472290190043,
"id" : "d182ddec-f1c7-41c5-8b0e-198bfb5d9efe"
}
}
}
}
这是我的数据类:
public class Account {
public long created;
public String id;
public HashMap<String, Object> toMap() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
map.put("created", ServerValue.TIMESTAMP);
return map;
}
}
public class Auth {
public String id;
public long created;
public boolean active;
public String account_id;
public HashMap<String, Object> toMap() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
map.put("created", ServerValue.TIMESTAMP);
map.put("active", active);
map.put("account_id", account_id);
return map;
}
}
这是我的多地点更新:
final Auth auth = new Auth();
auth.id = FirebaseAuth().getCurrentUser().getUid();
auth.active = true;
auth.account_id = "K" + System.currentTimeMillis(); // TODO replace with proper id generator
final Account account = new Account();
account.id = auth.account_id;
HashMap<String, Object> newUserMap = new HashMap<String, Object>();
newUserMap.put("/data/account/" + account.id, account.toMap());
newUserMap.put("/data/auth/" + auth.id, auth.toMap());
FirebaseDatabase().getReference().updateChildren(newUserMap);
我需要的是在数据存储之前验证data / account / $ account_id / id与/ data / auth / $ auth_id / account_id具有相同值的规则。
答案 0 :(得分:2)
将数据修剪回最小,看起来像你想要的那样:
{
"data" : {
"account" : {
"K1472290187836" : {
"id" : "K1472290187836"
}
},
"auth" : {
"d182ddec-f1c7-41c5-8b0e-198bfb5d9efe" : {
"account_id" : "K1472290187836",
}
}
}
}
这可能是一个好的开始:
{
"rules": {
"data": {
"account": {
"$id": {
"id": {
".validate": "newData.val() == $id"
}
}
},
"auth": {
"$uid": {
".write": "$uid === auth.uid",
"account_id": {
".validate": "
newData.parent().parent().child('account').child(newData.val()).exists() &&
newData.parent().parent().child('account').child(newData.val()).child('id').val() === newData.val()"
}
}
}
}
}
}
由于root
和data
是指写操作之前存在的数据,因此上面使用newData
,它指的是写操作后存在的数据(如果该操作成功)。
您并不需要在account_id验证中使用双重条件,因为第二个条件会复制第一个的功能。但由于我不确定您是否要验证帐户密钥或id属性的值,因此我添加了两个条件,以便轻松复制/粘贴/删除一个您不关心的问题。
如果您确实需要在该片段中存储两次ID,我建议您重新考虑。数据重复是常见的,但在这种情况下,我没有看到很多价值增益(并且它会引起像上面那样的考虑:哪个是领先的?)。