解析嵌套查询Android

时间:2014-12-10 03:13:57

标签: android parse-platform nested-query

好好坚持了几个星期,对不起长期的问题。

使用Parse,为Android制作锻炼应用程序。

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

锻炼

ID |名字|描述| Musclegroup

锻炼

ID | workoutName |用户ID

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

ID | workoutID(指针)| exerciseID(指针)

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

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

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

问题:

我尝试执行嵌套查询以获取练习名称,以便用户单击Eg。返回训练它应该显示一个列表例如。 Deadlift,Rows,Chin ups

所以基本上在SQL中我想:

选择名称 来自练习 其中的ID(从workoutexercises中选择exerciseID = xxxx中的exerciseID)

我挣扎的事情:

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

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

  3. EG。

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

    就像我曾经"通过"那个指针和练习表我假设我仍然只是获取String名称值而不是获得ParseObject?

    现在到目前为止,我已经能够让自定义适配器在屏幕上放置2个水平条,表明它知道我已经在exerciseExercises中放了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(存储getter)

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

    在调试模式下运行Android Studio我可以直接看到我想要放入文本字​​段的数据(参见截图 - 我如何获取该值?请参阅下面的截图 debug mode

    Exercise Name missing Workout Name

    现在正在工作 - 结果!

    enter image description here

1 个答案:

答案 0 :(得分:3)

首先,改变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的查询(包括workoutID),将在获取的查询中填充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();

希望这能够解决这个问题