for 循环似乎在循环 dataSnapshot 子级时不会停止中断
for loop seems like won't stop breaking when looping dataSnapshot children
{
"Users" : {
"750bf295-1a99-4b0f-a072-cae87d25f53e" : {
"email" : "aa@aa.aa",
"hotel" : {
"Island" : {
"author" : "Jole",
"comfort" : 5.0,
"food" : 2.0,
"latit" : 65.05243844618913,
"longit" : -19.647914953529835,
"name" : "Island",
"rating" : 3.0,
"review" : "OK nije los",
"service" : 2.0
},
},
"password" : "aa",
"username" : "Jole"
},
"8b76cd9e-6738-412d-9e55-986b1fe967f9" : {
"email" : "oo@oo.oo",
"hotel" : {
"Bologna" : {
"author" : "oooo",
"comfort" : 3.0,
"food" : 3.5,
"latit" : 44.507442,
"longit" : 11.348376,
"name" : "Bologna",
"rating" : 3.3333332538604736,
"review" : "woooooooow",
"service" : 3.5
},
"Lodz" : {
"author" : "oooo",
"comfort" : 5.0,
"food" : 1.5,
"latit" : 51.759325127252225,
"longit" : 19.455432258546352,
"name" : "Lodz",
"rating" : 3.3333332538604736,
"review" : "losa hrana",
"service" : 3.5
}
},
"password" : "oooo",
"username" : "oooo"
}
首先,这是我的JSON。现在,问题是,当我注册新用户时,我想仅在以前从未使用过用户名和电子邮件(或者两者都已存在)的情况下才允许注册。
我是使用 MVP 模式完成的,所以当我点击注册按钮时,它会检查 username/emai/password 字段是否正确 length/type 如果一切正常,它会调用演示者的 registerNewUser 方法:
@Override
public void registerNewUser(String username, String email, String password) {
interactor.checkIfUserExists(username, email, password);
}
然后调用交互器的 chekIfUserExists 方法:
@Override
public void checkIfUserExists(final String username, final String email, final String password) {
Firebase userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/");
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (email.equals(user.getEmail()) || username.equals(user.getUsername())) {
presenter.onUserAlreadyExists();
break;
} else {
presenter.onUserDoesNotExist(username, email, password);
}
}
}
当调用演示者的方法 onUserAlreadyExists 时,它只设置错误消息 "this username or email is already used"... 当调用演示者的方法 onUserDoesNotExist 时,它调用交互方法 tryToRegister() :
@Override
public void tryToRegister(final String username, final String email, final String password) {
userRef.createUser(email, password, new Firebase.ValueResultHandler<Map<String, Object>>() {
@Override
public void onSuccess(Map<String, Object> stringObjectMap) {
String uid = stringObjectMap.get("uid").toString();
userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/" + uid);
userRef.setValue(createUser(username, email, password));
presenter.onSuccess(email, username);
}
@Override
public void onError(FirebaseError firebaseError) {
presenter.onFailure();
}
});
}
现在,问题出在这个 for 循环中:
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (email.equals(user.getEmail()) || username.equals(user.getUsername())) {
presenter.onUserAlreadyExists();
break;
} else {
presenter.onUserDoesNotExist(username, email, password);
}
如果我尝试使用现有的电子邮件和不同的用户名注册,它会中断循环并调用演示者的 onUserAlreadyExists 方法并不断告诉我用户名或电子邮件已被使用并且未创建新用户,但是当我尝试注册时使用现有的用户名和不存在的电子邮件,它打破了循环,告诉我用户名或电子邮件已被使用,然后它使用现有的用户名和不存在的电子邮件创建新用户...我在这里遗漏了什么吗?
那是因为您的 if/else 语句将检查并触发每个用户名。
换句话说,如果新注册没有数据库中第一个用户的用户名或电子邮件,它仍然会创建一个新用户,然后转到数据库中的下一个用户,检查,重复,并继续直到它找到一个副本,然后说 "this username or email is already used," 然后才停止。
因此,要解决此问题,您不应该调用 presenter.onUserDoesNotExist(username, email, password);
,直到您完成快照中的每个用户并确保 none 匹配。
顺便说一句,很好的文档和对您问题的解释。
{
"Users" : {
"750bf295-1a99-4b0f-a072-cae87d25f53e" : {
"email" : "aa@aa.aa",
"hotel" : {
"Island" : {
"author" : "Jole",
"comfort" : 5.0,
"food" : 2.0,
"latit" : 65.05243844618913,
"longit" : -19.647914953529835,
"name" : "Island",
"rating" : 3.0,
"review" : "OK nije los",
"service" : 2.0
},
},
"password" : "aa",
"username" : "Jole"
},
"8b76cd9e-6738-412d-9e55-986b1fe967f9" : {
"email" : "oo@oo.oo",
"hotel" : {
"Bologna" : {
"author" : "oooo",
"comfort" : 3.0,
"food" : 3.5,
"latit" : 44.507442,
"longit" : 11.348376,
"name" : "Bologna",
"rating" : 3.3333332538604736,
"review" : "woooooooow",
"service" : 3.5
},
"Lodz" : {
"author" : "oooo",
"comfort" : 5.0,
"food" : 1.5,
"latit" : 51.759325127252225,
"longit" : 19.455432258546352,
"name" : "Lodz",
"rating" : 3.3333332538604736,
"review" : "losa hrana",
"service" : 3.5
}
},
"password" : "oooo",
"username" : "oooo"
}
首先,这是我的JSON。现在,问题是,当我注册新用户时,我想仅在以前从未使用过用户名和电子邮件(或者两者都已存在)的情况下才允许注册。
我是使用 MVP 模式完成的,所以当我点击注册按钮时,它会检查 username/emai/password 字段是否正确 length/type 如果一切正常,它会调用演示者的 registerNewUser 方法:
@Override
public void registerNewUser(String username, String email, String password) {
interactor.checkIfUserExists(username, email, password);
}
然后调用交互器的 chekIfUserExists 方法:
@Override
public void checkIfUserExists(final String username, final String email, final String password) {
Firebase userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/");
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (email.equals(user.getEmail()) || username.equals(user.getUsername())) {
presenter.onUserAlreadyExists();
break;
} else {
presenter.onUserDoesNotExist(username, email, password);
}
}
}
当调用演示者的方法 onUserAlreadyExists 时,它只设置错误消息 "this username or email is already used"... 当调用演示者的方法 onUserDoesNotExist 时,它调用交互方法 tryToRegister() :
@Override
public void tryToRegister(final String username, final String email, final String password) {
userRef.createUser(email, password, new Firebase.ValueResultHandler<Map<String, Object>>() {
@Override
public void onSuccess(Map<String, Object> stringObjectMap) {
String uid = stringObjectMap.get("uid").toString();
userRef = new Firebase("https://josip-my-application.firebaseio.com/Users/" + uid);
userRef.setValue(createUser(username, email, password));
presenter.onSuccess(email, username);
}
@Override
public void onError(FirebaseError firebaseError) {
presenter.onFailure();
}
});
}
现在,问题出在这个 for 循环中:
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (email.equals(user.getEmail()) || username.equals(user.getUsername())) {
presenter.onUserAlreadyExists();
break;
} else {
presenter.onUserDoesNotExist(username, email, password);
}
如果我尝试使用现有的电子邮件和不同的用户名注册,它会中断循环并调用演示者的 onUserAlreadyExists 方法并不断告诉我用户名或电子邮件已被使用并且未创建新用户,但是当我尝试注册时使用现有的用户名和不存在的电子邮件,它打破了循环,告诉我用户名或电子邮件已被使用,然后它使用现有的用户名和不存在的电子邮件创建新用户...我在这里遗漏了什么吗?
那是因为您的 if/else 语句将检查并触发每个用户名。
换句话说,如果新注册没有数据库中第一个用户的用户名或电子邮件,它仍然会创建一个新用户,然后转到数据库中的下一个用户,检查,重复,并继续直到它找到一个副本,然后说 "this username or email is already used," 然后才停止。
因此,要解决此问题,您不应该调用 presenter.onUserDoesNotExist(username, email, password);
,直到您完成快照中的每个用户并确保 none 匹配。
顺便说一句,很好的文档和对您问题的解释。