【问题标题】:Room only inserting 1 row every time (replacing previous)房间每次只插入 1 行(替换之前的)
【发布时间】:2021-11-17 08:47:42
【问题描述】:

我设置了一些 FK 约束,它们很可能是罪魁祸首,但经过大量试验和错误后我无法弄清楚。

问题:每次我插入一所新大学时,它都会替换最后一所。每次我在大学里插入一个学期,它都会取代旧的学期。每次我将一门课程插入一个学期时,它都会替换旧的。

类如下:

用户类

@Entity
public class User
{
    @PrimaryKey
    @NotNull
    private String userEmail;
    private String userName;

    public User(String userName, String userEmail)
    {
        this.userName = userName;
        this.userEmail = userEmail;
    }
}

大学.class

@Entity(foreignKeys = @ForeignKey(entity = User.class, parentColumns = "userEmail", childColumns = "userEmail", onDelete = CASCADE, onUpdate = CASCADE),
        indices = {@Index(value = {"userEmail"}, unique = true)})
public class University
{
    @PrimaryKey
    @NotNull
    private String universityName;
    private String userEmail;

    public University(String universityName, String userEmail)
    {
        this.universityName = universityName;
        this.userEmail = userEmail;
    }
}

学期班

@Entity(foreignKeys = @ForeignKey(entity = University.class, parentColumns = "universityName", childColumns = "universityName", onDelete = CASCADE, onUpdate = CASCADE),
        indices = {@Index(value = {"universityName"}, unique = true)})
public class Semester
{
    @PrimaryKey(autoGenerate = true)
    private Long semesterId;
    private String name;
    private String universityName;

    public Semester(Long semesterId, String name, String universityName)
    {
        this.semesterId = semesterId;
        this.name = name;
        this.universityName = universityName;
    }

    @Ignore
    public Semester(String name, String universityName)
    {
        this.name = name;
        this.universityName = universityName;
    }
}

课程.class

@Entity(foreignKeys = @ForeignKey(entity = Semester.class, parentColumns = "semesterId", childColumns = "semesterId", onDelete = CASCADE, onUpdate = CASCADE),
        indices = {@Index(value = {"semesterId"}, unique = true)})
public class Course
{
    @PrimaryKey(autoGenerate = true)
    private Long courseId;
    private String name;
    private String code;
    private Long semesterId;

    public Course(Long courseId, String name, String code, Long semesterId)
    {
        this.courseId = courseId;
        this.name = name;
        this.code = code;
        this.semesterId = semesterId;
    }

    @Ignore
    public Course(String name, String code, Long semesterId)
    {
        this.name = name;
        this.code = code;
        this.semesterId = semesterId;
    }
}

@Dao
public interface UserDao
{
    @Query("SELECT * FROM User LIMIT 1")
    User getUser();

    @Query("SELECT * FROM University WHERE userEmail = :userEmail")
    List<University> getUniversitiesByUser(String userEmail);

    @Query("SELECT * FROM University WHERE universityName = :universityName LIMIT 1")
    University getUniversityByName(String universityName);

    @Query("SELECT * FROM Semester WHERE name = :semesterName AND universityName = :universityName LIMIT 1")
    Semester getSemesterByNameAndUniversity(String semesterName, String universityName);

    @Query("SELECT * FROM Semester WHERE universityName = :universityName")
    List<Semester> getSemestersByUniversity(String universityName);

    @Query("SELECT * FROM Course WHERE semesterId = :semesterId")
    List<Course> getCoursesBySemester(long semesterId);

    /**
     * @param userEmail - The Email of the selected user
     * @return - A list of all incidents submitted by the user
     */
    @Query("SELECT * FROM Incident WHERE submitterEmail = :userEmail")
    List<Incident> getAllIncidentsByUser(String userEmail);

    // Updates
    @Update(onConflict = REPLACE) void updateUser(User user);
    @Update(onConflict = REPLACE) void updateUniversity(University university);
    @Update(onConflict = REPLACE) void updateSemester(Semester semester);

    // Inserts
    @Insert(onConflict = REPLACE) void insertUser(User user);
    @Insert(onConflict = REPLACE) void insertUniversity(University university);
    @Insert(onConflict = REPLACE) void insertSemester(Semester semester);
    @Insert(onConflict = REPLACE) void insertCourse(Course course);

    // Deletes
    @Delete void deleteUser(User user);
    @Delete void deleteUniversity(University university);
    @Delete void deleteSemester(Semester semester);
    @Query("DELETE FROM User")
    void deleteAllUsers();
}

【问题讨论】:

    标签: android android-sqlite android-room


    【解决方案1】:

    通过在与父级的关系上使用唯一索引,您将子级限制为 1-1 关系。

    所以每学期只能有 1 门课程,每所大学 1 学期和每个用户电子邮件 1 所大学。

    从索引中删除所有unique = true

    由于名称是主键,因此您也只能按名称拥有 1 个大学,因此大学只能拥有 1 个用户。我建议不要让用户作为大学的家长。

    要允许一个用户就读一所大学,而多个用户就读同一所大学,您可以颠倒这种关系。

    但是,您可能希望用户参加许多大学,在这种情况下,您将使用中间(关联/参考/映射以及其他名称)表。

    【讨论】:

    • 我的设置是否适合拥有多所大学(每所大学都有自己的学期和课程)的单个用户?
    • @Asim 是(假设已从索引中删除了唯一性)
    猜你喜欢
    • 2014-12-31
    • 2018-05-22
    • 2020-06-02
    • 2015-05-13
    • 2018-07-24
    • 2021-09-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多