- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上,我有 3 个相关实体,需要从中获取数据:exercise、exercise_workout_junction 和exercise_workout_goals。
我需要在 RecyclerView 中显示以下内容:
1. exercise_Name (from exercises entity)
2. number_Of_Sets (from workout_goals entity)
3. min_Reps (from workout_goals entity)
4. max_reps (from workout_goals entity)
(其中锻炼 ID 为 1、2、3 或 4,具体取决于所选的锻炼,并且显示的锻炼由锻炼 ID 确定。)
实现此目的的最佳方法是什么?
练习实体
@Entity(tableName = "exercises_table")
public class Exercises {
@PrimaryKey(autoGenerate = true)
int exercises_id;
private String exercise_name;
@ForeignKey(entity = ExerciseType.class, parentColumns = "exercise_type_id", childColumns = "exercise_type_id")
private int exercise_type_id;
@ForeignKey(entity = ExerciseEquipment.class, parentColumns = "exercise_equipment_id", childColumns = "exercise_equipment_id")
private int exercise_equipment_id;
public Exercises(String exercise_name, int exercise_type_id, int exercise_equipment_id ) {
this.exercise_name = exercise_name;
this.exercise_type_id = exercise_type_id;
this.exercise_equipment_id = exercise_equipment_id;
}
public int getExercise_equipment_id() {
return exercise_equipment_id;
}
public void setExercises_id(int exercise_equipment_id) {
this.exercises_id = exercises_id;
}
public int getExercises_id() {
return exercises_id;
}
public String getExercise_name() {
return exercise_name;
}
public int getExercise_type_id() {
return exercise_type_id;
}
}
锻炼目标实体
@Entity(tableName = "exercise_workout_goals_table")
public class Exercise_Workout_Goals {
@PrimaryKey(autoGenerate = true)
private int exercise_workout_goal_id;
@ForeignKey(entity = Junction.class, parentColumns = "exercise_workout_id", childColumns = "junction_id")
private int junction_id;
private int set_number;
private int min_reps;
private int max_reps;
public Exercise_Workout_Goals(int junction_id, int set_number, int min_reps, int max_reps ) {
this.junction_id = junction_id;
this.set_number = set_number;
this.min_reps = min_reps;
this.max_reps = max_reps;
}
public int getExercise_workout_goal_id() {
return exercise_workout_goal_id;
}
public void setExercise_workout_goal_id(int exercise_workout_goal_id) {
this.exercise_workout_goal_id = exercise_workout_goal_id;
}
public int getJunction_id() {
return junction_id;
}
public int getSet_number() {
return set_number;
}
public int getMin_reps() {
return min_reps;
}
public int getMax_reps() {
return max_reps;
}
}
连接实体
@Entity(tableName = "exercise_workout_junction_table")
public class Junction {
@PrimaryKey(autoGenerate = true)
private int exercise_workout_id;
@ForeignKey(entity = Exercises.class, parentColumns = "exercises_id", childColumns = "exercise_id")
int exercise_id;
@ForeignKey(entity = Workouts.class, parentColumns = "workout_id", childColumns = "workout_id")
private int workout_id;
public Junction(int exercise_id, int workout_id) {
this.exercise_id = exercise_id;
this.workout_id = workout_id;
}
public void setExercise_workout_id(int exercise_workout_id) {
this.exercise_workout_id = exercise_workout_id;
}
public int getExercise_workout_id() {
return exercise_workout_id;
}
public int getExercise_id() {
return exercise_id;
}
public int getWorkout_id() {
return workout_id;
}
}
数据库
@Database(entities = {Junction.class, Exercise_Workout_Goals.class, ExerciseEquipment.class,
Exercises.class, ExerciseType.class, Workouts.class, WorkoutType.class}, version = 4, exportSchema = false)
public abstract class ExerciseDatabase extends RoomDatabase {
private static ExerciseDatabase instance;
public abstract JunctionDao junctionDao();
public abstract ExerciseEquipmentDao exerciseEquipmentDao();
public abstract WorkoutTypeDao workoutTypeDao();
public abstract ExercisesDao exercisesDao();
public abstract WorkoutsDao workoutsDao();
public abstract ExerciseWorkoutGoalsDao exerciseWorkoutGoalsDao();
public abstract ExerciseTypeDao exerciseTypeDao();
//create instance of database
//synchronised means only one thread at a time can access this method so you don't accidentally create 2 instances of this database
public static synchronized ExerciseDatabase getInstance(Context context){
//we only want to instantiate this database if we don't already have an instance
if(instance == null){
//if there is no existing database we want to create one
instance = Room.databaseBuilder(context.getApplicationContext(),
ExerciseDatabase.class, "exercise_database")
//this tells room how to migrate to new schema when database version updated to avoid app crashing
.fallbackToDestructiveMigration()
//this adds the pre-populated database values
.addCallback(roomCallback)
.build();
}
return instance;
}
private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback(){
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
new PopulateDbAsyncTask(instance).execute();
}
};
private static class PopulateDbAsyncTask extends AsyncTask<Void,Void,Void> {
private JunctionDao junctionDao;
private ExerciseEquipmentDao exerciseEquipmentDao;
private ExerciseTypeDao exerciseTypeDao;
private WorkoutTypeDao workoutTypeDao;
private ExercisesDao exercisesDao;
private WorkoutsDao workoutsDao;
private ExerciseWorkoutGoalsDao exerciseWorkoutGoalsDao;
private PopulateDbAsyncTask(ExerciseDatabase db){
junctionDao = db.junctionDao();
exerciseEquipmentDao = db.exerciseEquipmentDao();
exerciseTypeDao = db.exerciseTypeDao();
workoutTypeDao = db.workoutTypeDao();
exercisesDao = db.exercisesDao();
workoutsDao = db.workoutsDao();
exerciseWorkoutGoalsDao = db.exerciseWorkoutGoalsDao();
}
@Override
protected Void doInBackground(Void... voids) {
// auto inc id
junctionDao.insert(new Junction(1,1));
junctionDao.insert(new Junction(2,1));
junctionDao.insert(new Junction(3,1));
junctionDao.insert(new Junction(4,1));
junctionDao.insert(new Junction(5,1));
junctionDao.insert(new Junction(6,1));
junctionDao.insert(new Junction(7,1));
junctionDao.insert(new Junction(8,1));
junctionDao.insert(new Junction(11,2));
junctionDao.insert(new Junction(9,2));
junctionDao.insert(new Junction(1,2));
junctionDao.insert(new Junction(2,2));
junctionDao.insert(new Junction(12,2));
junctionDao.insert(new Junction(13,2));
junctionDao.insert(new Junction(15,2));
junctionDao.insert(new Junction(16,2));
junctionDao.insert(new Junction(9,3));
junctionDao.insert(new Junction(2,3));
junctionDao.insert(new Junction(1,3));
junctionDao.insert(new Junction(5,3));
junctionDao.insert(new Junction(10,3));
junctionDao.insert(new Junction(6,3));
junctionDao.insert(new Junction(7,3));
junctionDao.insert(new Junction(8,3));
junctionDao.insert(new Junction(2,4));
junctionDao.insert(new Junction(1,4));
junctionDao.insert(new Junction(11,4));
junctionDao.insert(new Junction(3,4));
junctionDao.insert(new Junction(12,4));
junctionDao.insert(new Junction(13,4));
junctionDao.insert(new Junction(14,4));
junctionDao.insert(new Junction(15,4));
junctionDao.insert(new Junction(16,4));
// Auto inc id
exerciseEquipmentDao.insert(new ExerciseEquipment("A Person / Something Heavy"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Pull Up Bar"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Chair"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Bands"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Body-Weight"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Something heavy you can wedge your legs under/ A training partner\n"));
exerciseEquipmentDao.insert(new ExerciseEquipment("A form of weight\n"));
exerciseEquipmentDao.insert(new ExerciseEquipment("Backpack / Other form of weight\n"));
exerciseTypeDao.insert(new ExerciseType("Shoulders")); // auto inc ID
exerciseTypeDao.insert(new ExerciseType("Triceps"));
exerciseTypeDao.insert(new ExerciseType("Biceps"));
exerciseTypeDao.insert(new ExerciseType("Chest"));
exerciseTypeDao.insert(new ExerciseType("Back"));
exerciseTypeDao.insert(new ExerciseType("Legs"));
//auto inc id (pk)
workoutTypeDao.insert(new WorkoutType(" Full-Body"));
//auto inc primary key
exercisesDao.insert(new Exercises("Squat",6,1));
exercisesDao.insert(new Exercises("Pike Push-up",1,6));
exercisesDao.insert(new Exercises("Weighted Chin-up",5,5));
exercisesDao.insert(new Exercises("Nordic Hamstring Curls",6,7));
exercisesDao.insert(new Exercises("Dips",2,8));
exercisesDao.insert(new Exercises("Lateral Banded Side Raises",1,4));
exercisesDao.insert(new Exercises("Face Pulls with bands",1,4));
exercisesDao.insert(new Exercises("Band Bicep Curls",3,4));
exercisesDao.insert(new Exercises("Weighted Pull-ups",5,5));
exercisesDao.insert(new Exercises("Bulgarian Split Squats",6,9));
exercisesDao.insert(new Exercises("Push-ups",4,6));
exercisesDao.insert(new Exercises("Diamond Push-ups",2,6));
exercisesDao.insert(new Exercises("Seated Rows with Bands",5,4));
exercisesDao.insert(new Exercises("Resistance Band Chest Flyes",4,4));
exercisesDao.insert(new Exercises("Band Tricep Extensions",2,4));
exercisesDao.insert(new Exercises("Band Shrugs",5,4));
workoutsDao.insert(new Workouts("A",1));
workoutsDao.insert(new Workouts("B",1));
workoutsDao.insert(new Workouts("C",1));
workoutsDao.insert(new Workouts("D",1));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(1,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(2,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(3,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(4,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(5,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(6,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(7,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(8,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(9,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(10,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(11,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(12,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(13,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(14,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(15,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(16,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(17,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(18,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(19,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(20,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(21,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(22,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(23,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(24,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(25,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(26,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(27,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(28,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(29,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(30,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(31,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(32,3,4,50));
exerciseWorkoutGoalsDao.insert(new Exercise_Workout_Goals(33,3,4,50));
return null;
}
}
}
最佳答案
因此,您想要执行联接操作,然后将数据填充到回收器 View 中。 SQL 查询是
SELECT exercises_table.exercise_Name, exercise_workout_goals_table.set_number, exercise_workout_goals_table.min_reps, exercise_workout_goals_table.max_reps FROM exercises_table LEFT JOIN exercise_workout_junction_table ON exercises_table.exercises_id = exercise_workout_junction_table.exercise_workout_id LEFT JOIN exercise_workout_goals_table ON exercise_workout_junction_table.workout_id = exercise_workout_goals_table.exercise_workout_goal_id;
首先,创建一个新类(例如ExerciseAndGoal),其中包含连接操作的结果字段。然后在任何 DAO 中创建一个返回类型为 ExerceAndGoal 的列表的新函数。对 SQL 查询使用注释 @Query("")。
查看教程 https://medium.com/@gokulbalakrishnan/join-queries-room-persistence-library-f0527e7b0da1
现在您可以在后台线程中访问 DAO。假设你使用AsyncTask,你把它写在doInBackground()中。
查看 Android Room - simple select query - Cannot access database on the main thread
在 onPostExecute() 中,您将把列表填充到 recycerview 中。假设您按照教程并实现适配器类。现在适配器类中有一个列表。更新列表并调用notifyDataSetChanged()。
查看 https://developer.android.com/guide/topics/ui/layout/recyclerview
关于java - Android ROOM-如何在 RecyclerView 中显示来自 3 个相关实体的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61426239/
我在另一个 RecyclerView(parentRecyclerView) 中实现了 RecyclerView(childRecyclerView),图片说明了所有的实现: 我想编写一个 espre
我正在构建一个应用程序,它使用ViewPager2在页面之间水平滚动,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行水平滚动小部件,例如附加到寻呼机指示器类型
我正在尝试实现一个水平的 recyclerview 并且 recyclerview 的每个项目都将是一个具有网格布局的垂直 recyclerview。我面临的问题是,当我尝试垂直滚动子 recycle
我使用显示条目列表的 RecyclerView。每个条目都托管另一个 RecyclerView,它是一个图像列表。 我现在想让这个嵌套的 RecyclerView 可点击,而不是它的项目,而是整个 V
我正在尝试将手机中的图像加载到我的回收 View 中。 到目前为止,我已经创建了一个 recyclerview.adapter 和一个 gridlayoutmanager,并将它们附加到我的 recy
我需要一个可扩展 View ,其中父/可扩展标题将具有文本和下拉箭头。每个此类标题的子项应该是在网格结构中具有多个项目的 View 。 (有点像带有 GridLayoutManager 的回收器 Vi
我正在使用显示不同类别列表的 RecyclerView。每行项目还包含 RecyclerView 以显示类别项目列表。父级 RecyclerView 由垂直 LinearLayoutManager 填
我正在更新一个旧的 Android 项目,现在我从 RecyclerView 中反复收到这条日志语句: W/RecyclerView:RecyclerView 不支持滚动到绝对位置。改为使用 scro
在我的 Adapter 中,我调用 LayoutManager.ChildAt(position) 来获取 itemview,但是我得到的 View 不是匹配的 itemview,当我调用 notif
我正在从 ListView 迁移到 RecyclerView,但是在 SQLite 中输入一些数据后,我的列表没有使用 notifyDataSetChanged() 更新;所以我总是要调用setAda
我正在用 Google Now Cards 的风格创建一组 5 张卡片。我首先关注的是总体布局。 我正在使用 CardView 和 RecyclerView ,我想要实现的是这样的: 这是我的 Car
在我的应用程序中,我有一个 RecyclerView,其中包含一个简单的项目 View ,每行包含一个 TextView 和一个 Spinner。 用户从操作栏中单击“保存”后,我需要遍历所有项目并获
我正在尝试检查 RecyclerView 中是否可以看到某些特定项目;但我无法实现。请帮助我确定我的项目是否在 RecyclerView 中完全可见。 mrecylerView.addOnScroll
我有一个提要片段,它的主要元素是帖子的 RecyclerView。 我正在使用 Lisa Wray 的 Groupie 库管理回收站 https://github.com/lisawray/group
我有这两个类似的行为回收器 View 适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑将类 B 设计为从回收器 View 适配器继承,这样我就可以更改构造函数来执
这很奇怪。我对这个问题感到沮丧。我将数据保存在 ArrayList 中。当我将数据放在 RecyclerView 上时。数据未显示在列表中。这是我的代码 listOrder.forEach { ord
编辑我通过使用 CoordinatorLayout 和 AppBarLayout 作为 header 和 TabLayout 的包装解决了这个问题。本来应该很明显,但是哦,好吧。 原始问题:我有一个设
我有一个回收 View 。我想从其适配器类更新回收器 View 。我尝试了 notiftDataSetChanged( ) 但它只适用于主类。下面是 recyclerview 适配器类的代码。 pac
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想创建一个与 Google Play Store 或 Netflix App 类似的布局,其中在单个 RecyclerView 中基本上有多个水平 RecyclerView。如果这不是他们做事的方式
我是一名优秀的程序员,十分优秀!