在Android中使用Room数据库时,可能会遇到一些关系问题,如一对一关系、一对多关系或多对多关系。下面是一些解决这些问题的示例代码:
一对一关系: 首先,我们需要定义两个实体类,例如User和Address。一个用户只能有一个地址,一个地址只能属于一个用户。
@Entity
public class User {
@PrimaryKey
public int userId;
public String name;
// One-to-one relationship with Address
@Embedded
public Address address;
}
@Entity
public class Address {
@PrimaryKey
public int addressId;
public String street;
public String city;
public String state;
}
然后,在数据库访问对象(DAO)中定义查询方法:
@Dao
public interface UserDao {
@Query("SELECT * FROM User")
List getUsers();
@Query("SELECT * FROM User WHERE userId = :userId")
User getUserById(int userId);
@Transaction
@Query("SELECT * FROM User WHERE userId = :userId")
UserWithAddress getUserWithAddressById(int userId);
@Insert
void insertUser(User user);
@Update
void updateUser(User user);
@Delete
void deleteUser(User user);
}
@Dao
public interface AddressDao {
@Insert
void insertAddress(Address address);
@Update
void updateAddress(Address address);
@Delete
void deleteAddress(Address address);
}
最后,在数据库类中定义关系:
@Database(entities = {User.class, Address.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
public abstract AddressDao addressDao();
}
一对多关系: 在一对多关系中,一个实体类(如Class)可以有多个其他实体类(如Student)的关联。
@Entity
public class Class {
@PrimaryKey
public int classId;
public String className;
}
@Entity
public class Student {
@PrimaryKey
public int studentId;
public String name;
// Many-to-one relationship with Class
public int classId;
}
在DAO中定义查询方法:
@Dao
public interface ClassDao {
@Query("SELECT * FROM Class")
List getClasses();
@Query("SELECT * FROM Class WHERE classId = :classId")
Class getClassById(int classId);
@Transaction
@Query("SELECT * FROM Class WHERE classId = :classId")
ClassWithStudents getClassWithStudentsById(int classId);
@Insert
void insertClass(Class class);
@Update
void updateClass(Class class);
@Delete
void deleteClass(Class class);
}
@Dao
public interface StudentDao {
@Insert
void insertStudent(Student student);
@Update
void updateStudent(Student student);
@Delete
void deleteStudent(Student student);
}
多对多关系: 在多对多关系中,两个实体类(如Student和Course)相互关联。
@Entity
public class Student {
@PrimaryKey
public int studentId;
public String name;
}
@Entity
public class Course {
@PrimaryKey
public int courseId;
public String courseName;
}
@Entity(primaryKeys = {"studentId", "courseId"})
public class StudentCourseCrossRef {
public int studentId;
public int courseId;
}
在DAO中定义查询方法:
@Dao
public interface StudentDao {
@Query("SELECT * FROM Student")
List getStudents();
@Query("SELECT * FROM Student WHERE studentId = :studentId")
Student getStudentById(int studentId);
@Transaction
@Query("SELECT * FROM Student WHERE studentId = :studentId")
StudentWithCourses getStudentWithCoursesById(int studentId);
@Insert
void insertStudent(Student student);
@Update
void updateStudent(Student student);
@Delete
void deleteStudent(Student student);
}
@Dao
public interface CourseDao {
@Query("SELECT * FROM Course")
List getCourses();
@Query("SELECT * FROM Course WHERE courseId = :courseId")
Course getCourseById(int courseId);
@Transaction
@Query("SELECT * FROM Course WHERE courseId = :courseId")
CourseWithStudents getCourseWithStudentsById(int courseId);
@Insert
void insertCourse(Course course);
@Update
void updateCourse(Course