如何在 parse android 中获取多个对象
how to fetch more than one object in parse android
public void getSchoolClasses(ArrayList<SchoolClass>schoolClassesIds , final CompletionHandler completionHandler){
ParseQuery<ParseObject> query = ParseQuery.getQuery("schoolClasses");
query.whereContainedIn("objectId",schoolClassesIds);
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
for (int i =0 ; i < objects.size();i++){
SchoolClass schoolClass=(SchoolClass)objects.get(i);
schoolClass.getTeacher().fetchInBackground(new GetCallback<ParseObject>() {
@Override
public void done(ParseObject object, ParseException e) {
}
});
}
}else{
completionHandler.onError(e);
}
}
});
}
我如何知道何时完成所有对象的提取并触发完成处理程序?
从你的代码中我可以了解到你有一所学校 class 并且每所学校可以有 1...许多老师。
对于该结构,您应该使用 pointers。
指针允许您保存 2 个解析对象之间的一对多关系,最大的优点是您可以执行 one api 调用来获取您需要的所有数据,这样您就可以不需要在循环中调用 fetch,这是一种不好的做法。
要使用指针,您需要执行以下操作:
- 转到您的学校子 class 并为教师添加 setter 和 getter。教师的类型为 List<{Teacher Sub Class object}>
- 您的查询现在应该如下所示:
ParseQuery<ParseObject> query = ParseQuery.getQuery("schoolClasses");
query.whereContainedIn("objectId",schoolClassesIds);
query.include("teachers"); // this line will fetch also the teachers together with the school
- 在您的查询回调中,您现在可以通过以下方式访问教师:
学校Class学校Class=(学校Class)objects.get(i);
schoolClass.getTeachers();
- Pointers 还允许您通过在 include 函数中使用点符号来检索关系的关系(例如 "teachers.students" 将为每个人带来所有教师和所有学生老师)。这就是我告诉你使用指针的原因。
您可以在 here
中阅读更多相关信息
我还建议您也阅读 Sub Classing 您的解析对象。通过查看您的代码,您似乎并没有真正使用它。解析对象的子 classing 使您可以使代码更有条理,还可以轻松访问解析对象。
请阅读有关 Subclass 的更多信息以及如何在 here 中使用它
这不是强制性的,只是一个建议:)
public void getSchoolClasses(ArrayList<SchoolClass>schoolClassesIds , final CompletionHandler completionHandler){
ParseQuery<ParseObject> query = ParseQuery.getQuery("schoolClasses");
query.whereContainedIn("objectId",schoolClassesIds);
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
for (int i =0 ; i < objects.size();i++){
SchoolClass schoolClass=(SchoolClass)objects.get(i);
schoolClass.getTeacher().fetchInBackground(new GetCallback<ParseObject>() {
@Override
public void done(ParseObject object, ParseException e) {
}
});
}
}else{
completionHandler.onError(e);
}
}
});
}
我如何知道何时完成所有对象的提取并触发完成处理程序?
从你的代码中我可以了解到你有一所学校 class 并且每所学校可以有 1...许多老师。 对于该结构,您应该使用 pointers。 指针允许您保存 2 个解析对象之间的一对多关系,最大的优点是您可以执行 one api 调用来获取您需要的所有数据,这样您就可以不需要在循环中调用 fetch,这是一种不好的做法。
要使用指针,您需要执行以下操作:
- 转到您的学校子 class 并为教师添加 setter 和 getter。教师的类型为 List<{Teacher Sub Class object}>
- 您的查询现在应该如下所示:
ParseQuery<ParseObject> query = ParseQuery.getQuery("schoolClasses");
query.whereContainedIn("objectId",schoolClassesIds);
query.include("teachers"); // this line will fetch also the teachers together with the school
- 在您的查询回调中,您现在可以通过以下方式访问教师:
学校Class学校Class=(学校Class)objects.get(i); schoolClass.getTeachers();
- Pointers 还允许您通过在 include 函数中使用点符号来检索关系的关系(例如 "teachers.students" 将为每个人带来所有教师和所有学生老师)。这就是我告诉你使用指针的原因。
您可以在 here
中阅读更多相关信息我还建议您也阅读 Sub Classing 您的解析对象。通过查看您的代码,您似乎并没有真正使用它。解析对象的子 classing 使您可以使代码更有条理,还可以轻松访问解析对象。
请阅读有关 Subclass 的更多信息以及如何在 here 中使用它 这不是强制性的,只是一个建议:)