好好坚持了几个星期,对不起长期的问题。
使用Parse,为Android制作锻炼应用程序。
与我的问题相关的数据库表和列是:
锻炼
ID |名字|描述| Musclegroup
锻炼
ID | workoutName |用户ID
WorkoutExercises (基本上是两者之间的连接表)
ID | workoutID(指针)| exerciseID(指针)
因此,用户将能够创建锻炼并添加他们想要的锻炼。
到目前为止,我已经完成了:
问题:
我尝试执行嵌套查询以获取练习名称,以便用户单击Eg。返回训练它应该显示一个列表例如。 Deadlift,Rows,Chin ups
所以基本上在SQL中我想:
选择名称 来自练习 其中的ID(从workoutexercises中选择exerciseID = xxxx中的exerciseID)
我挣扎的事情:
对指针进行嵌套查询,从我在网上读到的内容我需要使用query.include(" exerciseID");这将告诉Parse包含一个完整的练习项目,然后我可以用它来查询?纠正我,如果错了?下面的代码 - 我做得对吗?
我从以下方法中学习并使用了方法:http://www.michaelevans.org/blog/2013/08/14/tutorial-building-an-android-to-do-list-app-using-parse/其中查询数据被放入列出数据的自定义适配器中。它使用getter 和setter保存/检索String / int值,我仍然使用getters从指针中获取字符串吗?
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我可以直接看到我想要放入文本字段的数据(参见截图 - 我如何获取该值?请参阅下面的截图
现在正在工作 - 结果!
答案 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();
希望这能够解决这个问题