2

長い質問で申し訳ありません。

Parseを使って、Android向けのワークアウトアプリを作っています。

私の問題に関連するデータベースのテーブルと列は次のとおりです。

演習

ID| 名前 | 説明 | 筋群

ワークアウト

ID| ワークアウト名| ユーザーID

WorkoutExercises (基本的に 2 つの結合テーブル)

ID| ワークアウト ID (ポインター) | エクササイズ ID (ポインター)

したがって、ユーザーはワークアウトを作成し、必要なエクササイズを追加できます。

これまでのところ、私はすでに行っています:

  • ユーザーはカテゴリに移動し、筋肉グループを閲覧し、そのグループのエクササイズを表示できます
  • サインアップ/ログイン/ログアウト、プロフィールの更新
  • 現在のワークアウトをリストします (それらのエクササイズではありません) - 新しいワークアウトを挿入することを心配する前に、そのワークアウトで現在のエクササイズを照会することに行き詰まったため、db のワークアウトにいくつかのエクササイズを入力しました。

問題:

エクササイズ名を取得するためにネストされたクエリを実行しようとしているので、ユーザーがEgをクリックすると. Back Workout リストが表示されるはずです。デッドリフト、ロウ、チンアップ

だから基本的にSQLで私はしたい:

ID が含まれるエクササイズから名前を選択 (WorkoutID=xxxx のワークアウトエクササイズからエクササイズ ID を選択)

私が苦労していること:

  1. ネットで読んだことから、ポインターのネストされたクエリを作成するには、query.include("exerciseID"); を使用する必要があります。クエリに使用できる完全な演習アイテムを含めるようにParseに指示するのはどれですか? 間違っていたら訂正しますか?以下のコード - 正しく実行しましたか?

  2. 私は次の方法から学び、使用しています: http://www.michaelevans.org/blog/2013/08/14/tutorial-building-an-android-to-do-list-app-using-parse/クエリ データは、データを一覧表示するカスタム アダプターに入れられます。ゲッターとセッターを使用して文字列/整数値を保存/取得しますが、ポインタ内から文字列を取得するためにゲッターを使用しますか?

例えば。

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

かつてのように、私はそのポインターを「通過」しており、演習テーブルでは、ParseObject を取得するのではなく、まだ文字列名の値を取得していると仮定していますか?

これまでのところ、カスタム アダプターを取得して、画面全体に 2 つの水平バーを配置することができました。これは、workoutExercises に 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 をデバッグ モードで実行すると、テキスト フィールドに入力しようとしているデータを文字通り見ることができます (スクリーンショットを参照 - その値を取得するにはどうすればよいですか?以下のスクリーンショットを参照) デバッグモード

演習名がありません ワークアウト名

動作中 - 結果!

ここに画像の説明を入力

4

1 に答える 1

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);
    }

}

これで、workoutID を含む WorkoutExercises のクエリで、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();

これが問題に光を当てることを願っています

于 2014-12-10T13:53:56.427 に答える