Android 解析嵌套查询

Android 解析嵌套查询,android,parse-platform,nested-query,Android,Parse Platform,Nested Query,好的,我已经被困在这个问题上好几个星期了,很抱歉问了这么长的问题 使用Parse,为Android制作一个训练应用程序 与我的问题相关的数据库表和列包括: 练习 ID |名称|描述|肌肉群 运动 ID | workoutName | userID WorkoutExercises基本上是两者之间的联接表 ID | workUtid指针| exerciseID指针 因此,用户将能够创建训练并添加他们想要的训练 到目前为止,我已经完成了: 用户可以进入类别,浏览肌肉组,查看该组中的练习 注册/登录/

好的,我已经被困在这个问题上好几个星期了,很抱歉问了这么长的问题

使用Parse,为Android制作一个训练应用程序

与我的问题相关的数据库表和列包括:

练习

ID |名称|描述|肌肉群

运动

ID | workoutName | userID

WorkoutExercises基本上是两者之间的联接表

ID | workUtid指针| exerciseID指针

因此,用户将能够创建训练并添加他们想要的训练

到目前为止,我已经完成了:

用户可以进入类别,浏览肌肉组,查看该组中的练习 注册/登录/注销,更新配置文件 列出当前的训练,而不是其中的练习- 我刚刚在db上的训练中输入了一些练习,因为在担心插入新练习之前,我一直在查询该训练中的当前练习。 问题是:

我正在尝试进行嵌套查询,以获取练习名称,因此一旦用户单击(例如,Back Workout),它将显示一个列表(例如,Deadlift、Rows、China ups)

因此,基本上在SQL中,我想:

选择名称 从练习中 其中ID在从workoutexercises中选择exerciseID,其中WorkoutID=xxxx

我正在努力的事情:

对指针进行嵌套查询,根据我在网上读到的内容,我需要使用query.includeexeciseid;这将告诉Parse包含一个完整的练习项,然后我可以使用它进行查询?如果我错了,请纠正我?下面的代码-我做得正确吗

我从中学习并使用了以下方法:将查询数据放入列出数据的自定义适配器中。它使用getter 和setter来保存/检索String/int值,我是否仍然使用getter从指针中获取字符串

例如

就像在一次我通过那个指针,在练习表中,我假设我仍然只是得到字符串名称值,而不是得到一个ParseObject

现在到目前为止,我已经能够让自定义适配器在屏幕上放置2个水平条,显示它知道我在WorkoutExchanges中放置了3个项目,但只是没有从嵌套查询中调出我需要的来自练习名称的文本

看看我的截图,看看我的意思

非常感谢您事先的帮助

到目前为止的查询:

    public void getcurrentExercisesInWorkout() {
    //set progress bar
    setProgressBarIndeterminateVisibility(true);
    ParseQuery<WorkoutExercises> query = ParseQuery.getQuery("WorkoutExercises");
    query.include("exerciseId");
    query.whereEqualTo("workoutId", mWorkoutId);

    query.findInBackground(new FindCallback<WorkoutExercises>() {
        @Override
        public void done(List<WorkoutExercises> workoutExercises, ParseException error) {
            if (workoutExercises != null) {

                mWorkoutExercisesAdapter.clear();
                mWorkoutExercisesAdapter.addAll(workoutExercises);

            } else {
                Log.d("error", error.getMessage());
            }
        }
    });
    //stop progress bar
    setProgressBarIndeterminateVisibility(false);
}
在调试模式下运行Android Studio,我可以看到我试图输入文本字段的数据。请看屏幕截图-我如何获取该值?请参见下面的屏幕截图

现在工作-结果


首先,更改WorkoutExercises对象:

@ParseClassName("WorkoutExercises")
public class WorkoutExercises extends ParseObject {
    //public String exName;
    public static final String workoutID = "workoutID" 
    public static final String exerciseID = "exerciseID" 

    public Exercises getWorkoutExercise() {
        return (Exercises)getParseObject(exerciseID);
    }

    public WorkoutExercises()
    {
        // not sure if it is allowed to define your own constructor?
        // just a note
    }

    // WorkoutExercises does not have a 'name' col
    //public String getWorkoutExercise()
    //{
    //    return getString("name");
    //}
}
// workoutExercises returned from a query including workoutID
Exercises exercise = workoutExercises.getWorkoutExercise();
String name = exercise.getName();

// if Exercises has getters for description and Musclegroup
String description = exercise.getDescription();
String musclegroup= exercise.getMusclegroup();
我假设练习至少包含以下内容:

@ParseClassName("Exercises")
public class Exercises extends ParseObject {

    public static final String name = "name" 


    public String getName()
    {
        return getString(name);
    }

}
现在,使用包含workoutID的WorkoutExercises查询,将在获取的查询中填充Exercises对象。这意味着您可以执行以下操作以获取练习对象的名称:

@ParseClassName("WorkoutExercises")
public class WorkoutExercises extends ParseObject {
    //public String exName;
    public static final String workoutID = "workoutID" 
    public static final String exerciseID = "exerciseID" 

    public Exercises getWorkoutExercise() {
        return (Exercises)getParseObject(exerciseID);
    }

    public WorkoutExercises()
    {
        // not sure if it is allowed to define your own constructor?
        // just a note
    }

    // WorkoutExercises does not have a 'name' col
    //public String getWorkoutExercise()
    //{
    //    return getString("name");
    //}
}
// workoutExercises returned from a query including workoutID
Exercises exercise = workoutExercises.getWorkoutExercise();
String name = exercise.getName();

// if Exercises has getters for description and Musclegroup
String description = exercise.getDescription();
String musclegroup= exercise.getMusclegroup();

希望这能对问题有所帮助

请提供workoutexercise的实现。getWorkoutExerciseSure,添加在屏幕截图上方。谢谢如果我理解正确,您只需执行以下操作:nameView.setTextExercisesworkoutExercises.getWorkoutExercise.getName;假设您有一个练习子类,就像您在WorkoutExchanges中看到的那样,否则为nameView.SetTextWorkoutExchanges.GetWorkoutExchange.get'name';。后者在任何情况下都应该起作用,因为包含的指针总是解析为ParseObject子类extend ParseObject,所以调用getnameOfKey和putkey时,应该始终支持value;关于您的查询的一个小评论:setProgressBarIndeterminateVisibilityfalse;应该在done函数中,以便在查询返回结果时删除进度指示器。噢,我的天哪!你这个传奇人物!我无法表达我有多高兴。太完美了!绝对有效。我真是欣喜若狂!非常感谢你的帮助,我知道这是一个很长的问题。此外,我移动了progressbar指示器,正如您所说,在查询完成后停止旋转-之前从未走那么远,所以这太棒了!等不及今晚回家继续编码了!在问题的最底部添加了一个屏幕截图,向您展示结果:呵呵,我很高兴我能提供帮助;快乐编码。顺便说一句,您似乎已经创建了自己的适配器来显示结果,只是想让您知道,parse.com上的家伙也制作了一个:。我建议您查看一下它,因为它“隐藏”了查询,并允许您访问诸如onload和onload之类的回调,这使得添加加载指示器变得很容易。非常好。谢谢,我不知道。是的,我有一个自定义适配器。将有一本关于Parse的书。@cYrixmorten我可以向您寻求帮助吗:
// workoutExercises returned from a query including workoutID
Exercises exercise = workoutExercises.getWorkoutExercise();
String name = exercise.getName();

// if Exercises has getters for description and Musclegroup
String description = exercise.getDescription();
String musclegroup= exercise.getMusclegroup();