解析嵌套查询 Android

Posted

技术标签:

【中文标题】解析嵌套查询 Android【英文标题】:Parse Nested Query Android 【发布时间】:2015-02-08 03:50:12 【问题描述】:

好吧,这个问题已经被困了好几个星期了,很抱歉这个问题太长了。

使用 Parse,制作适用于 android 的锻炼应用。

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

练习

ID|姓名 |描述 |肌肉群

锻炼

ID|锻炼名称|用户ID

WorkoutExercises(基本上是两者之间的连接表)

ID|锻炼ID(指针)|练习ID(指针)

因此,用户将能够创建锻炼并添加他们想要的锻炼。

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

用户可以进入分类,浏览肌肉群,查看该群的锻炼情况 注册/登录/注销,更新个人资料 列出当前的锻炼(不是其中的锻炼)- 我刚刚在数据库上输入了一些练习,因为在担心插入新练习之前,我一直在查询该练习中的当前练习。

问题:

我正在尝试进行嵌套查询以获取练习名称,因此一旦用户单击 Eg。 Back 锻炼它应该会显示一个列表,例如。硬拉、划船、引体向上

所以基本上我想在 SQL 中:

选择名称 从练习 其中 ID 在(从 WorkoutID=xxxx 的锻炼锻炼中选择锻炼 ID)

我正在努力的事情:

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

    我从http://www.michaelevans.org/blog/2013/08/14/tutorial-building-an-android-to-do-list-app-using-parse/ 中学习并使用了以下方法,其中查询数据被放入列出数据的自定义适配器中。它使用吸气剂 和 setter 来保存/检索 String/int 值,我是否仍然使用 getter 从指针中获取字符串?

EG。

public String getName()
    
        return getString("name");
    

一旦我“通过”该指针并在练习表中我假设我仍然只是获取字符串名称值而不是获取 ParseObject?

到目前为止,我已经能够让自定义适配器在屏幕上放置 2 个水平条,这表明它知道我已经在锻炼练习中放置了 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);

自定义列表适配器:

//constructor - get current state of parsed object and list of objects retrieved from workout
public WorkoutExercisesAdapter(Context context, List<WorkoutExercises> objects) 
    super(context, R.layout.row_item, objects);
    this.mContext = context;
    this.mWorkoutExercises = objects;

public View getView(int position, View convertView, ViewGroup parent)

    //put each item into the listview
    if(convertView == null)
    
        LayoutInflater mLayoutInflater = LayoutInflater.from(mContext);
        convertView = mLayoutInflater.inflate(R.layout.row_item,null);
    
    WorkoutExercises workoutExercises = mWorkoutExercises.get(position);

    TextView nameView = (TextView) convertView.findViewById(R.id.row_name);
    //this just calls a String getter - which isn't working - need it to get the Exercise name from within the pointer
    nameView.setText(workoutExercises.getWorkoutExercise());
    return convertView;

WorkoutExercises(存储吸气剂)

    @ParseClassName("WorkoutExercises")
public class WorkoutExercises extends ParseObject 
    public String exName;
    public WorkoutExercises()
    
    
    public String getWorkoutExercise()
    
        return getString("name");
    

在调试模式下运行 Android Studio 我可以从字面上看到我试图放入文本字​​段的数据(见截图 - 我如何获取该值?见下面的截图

现在工作 - 结果!

【问题讨论】:

请提供workoutExercises.getWorkoutExercise()的实现 当然,在屏幕截图上方添加。谢谢 如果我对您的理解正确,您只需执行以下操作:nameView.setText(((Exercises)workoutExercises.getWorkoutExercise()).getName()); 假设您有一个练习子类(好像您有 WorkoutExercises),否则为 nameView.setText(workoutExercises.getWorkoutExercise().get('name'));。后者也应该在任何一种情况下都有效,因为包含的指针始终解析为 ParseObject(子类扩展 ParseObject),因此应始终支持调用 get(nameOfKey)put(key, value) 更正:nameView.setText(workoutExercises.getWorkoutExercise().getString('name')); 对您的查询的一个小注释:setProgressBarIndeterminateVisibility(false); 应该在done() 函数内,以便在查询返回结果后删除进度指示器。 【参考方案1】:

首先,修改 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");
    //

我假设练习至少包含以下内容:

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

    public static final String name = "name" 


    public String getName()
    
        return getString(name);
    


现在,通过对 WorkoutExercises 的查询(包括锻炼 ID),Exercises 对象将填充到获取的查询中。这意味着您可以执行以下操作来获取练习对象的名称:

// 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();

希望这能解决问题

【讨论】:

天啊!你的传奇!我无法表达我有多高兴。那太完美了!绝对有效。我真是欣喜若狂!非常感谢您的帮助,我知道这是一个很长的问题。此外,我移动了进度条指示器,如您所说,在查询完成后停止旋转 - 以前从未有过那么远,所以这很棒!等不及今晚回家继续编码!还在问题的最底部添加了一个屏幕截图,以向您展示结果:) 呵呵我很高兴能帮上忙 ;) 编码愉快。顺便说一句,您好像已经创建了自己的适配器来显示结果,只是为了让您知道,parse.com 的人也制作了一个:parse.com/docs/android_guide#ui-queryadapter。我建议你看一下它,因为它“隐藏”了查询,并让你可以访问像 onLoading()onLoaded() 这样的回调,这使得添加加载指示器变得容易。 优秀。谢谢,我不知道。是的,我确实有一个自定义适配器。将阅读有关 Parse 的文章。 @cYrixmorten 我可以请你帮忙吗:***.com/questions/30822478/…

以上是关于解析嵌套查询 Android的主要内容,如果未能解决你的问题,请参考以下文章

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

TypeORM Apollo 嵌套查询解析器

嵌套查询/解析器时的 GraphQL.js 订阅响应错误

如何在嵌套查询的解析器函数中传递根参数?

GraphQL 嵌套查询返回 null

解析云代码嵌套查询时未调用代码 141 成功/错误消息