為什麼儀器化的房間測試會出現錯誤 FOREIGN KEY 約束失敗

慕斯2388

我不明白這個錯誤,我有兩個實體任務和項目,一個任務分配給一個項目(見下面的代碼)。

但是當我想測試添加一個任務時,我有這個錯誤:android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)

我嘗試添加onDelete = CASCADE到 FOREIGNKEY 但我的測試不起作用:/

任務類

@Entity(tableName = "task_table",
        foreignKeys = @ForeignKey(entity = Project.class,
        parentColumns = "id",
        childColumns = "projectId"))

public class Task {
    /**
     * The unique identifier of the task
     */
    @PrimaryKey(autoGenerate = true)
    public long id;

    private long projectId;

    
    @SuppressWarnings("NullableProblems")
    @NonNull
    private String name.

    private long creationTimestamp;

    public Task(long projectId, @NonNull String name, long creationTimestamp) {
        this.setProjectId(projectId);
        this.setName(name);
        this.setCreationTimestamp(creationTimestamp);
    }
...

任務道

@Dao
public interface TaskDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(Task task);


    @Query("DELETE  FROM task_table WHERE id = :id")
    void delete(long id);

    @Query("SELECT * FROM task_table ORDER BY id ASC")
    LiveData<List<Task>> getAllTasks();

    @Query("SELECT * FROM task_table WHERE id = :id")
    LiveData<Task> getTaskById(long id);
}

項目類

@Entity(tableName = "project_table")
public class Project {
    /**
     * The unique identifier of the project
     */
    @PrimaryKey(autoGenerate = true)
    public long id;

    @NonNull
    private  String name;

    @ColorInt
    private  int color;

    public Project(@NonNull String name, @ColorInt int color) {
        this.name = name;
        this.color = color;
    }

道項目

@Dao
public interface ProjectDao {


    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insert(Project project);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<Project> projects);


    @Query("SELECT * FROM project_table")
    LiveData<List<Project>> getAllProjects();


    @Query("SELECT * FROM project_table WHERE id = :id")
    LiveData<Project> getProjectById(long id);

}

測試儀器:

 @Before
    public void createDb() {
        this.database = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(),
                AppDatabase.class)
                .allowMainThreadQueries()
                .build();

        taskDao = database.taskDao();
        projectDao = database.projectDao();
    }

    @After
    public void closeDb() {
        database.close();
    }
@Test
    public void addTask() {

        Project project = new Project("toto", 0xFFB4CDBA);
        this.projectDao.insert(project);
        long projectId = project.getId();

        assertThat(projectId, equalTo(project.getId()));

        Task task = new Task(projectId, "tâche 1", new Date().getTime());

        this.taskDao.insert(task);
}

如果有人可以幫助它會非常友好,我不知道我該如何解決這個問題。

非常感謝您的幫助

邁克

項目 id 將是 0,因為它沒有根據您使用時插入的值進行設置long projectId = project.getId();

因此,將 Task 作為項目的 id 列插入時的 ForeignKey 衝突將由 SQLite 生成,並且不會為 0(它將為 1 或更大)。

改變

@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Project project);

to(獲取實際生成的 id)

@Insert(onConflict = OnConflictStrategy.IGNORE)
long insert(Project project); // will return the id that has been generated 

然後使用:-

    Project project = new Project("toto", 0xFFB4CDBA);
    long projectId = this.projectDao.insert(project); //<<<<< returns the actual id
    project.setId(projectId); // sets project id according to the inserted id BUT only if inserted and not ignored when returned value will be -1
    // You should really check for -1 and handle accordingly
   
    assertThat(projectId, equalTo(project.getId())); // not really of any use

    Task task = new Task(projectId, "tâche 1", new Date().getTime());
    this.taskDao.insert(task);
  • 請注意,以上是原則代碼,尚未編譯或運行/測試。因此,它可能包含一些錯誤。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

向表室添加數據時,FOREIGN KEY 約束失敗(代碼 787 SQLITE_CONSTRAINT_FOREIGNKEY)

為什麼未等待的 Future 錯誤使我的測試失敗?

SqlException: INSERT 語句與 FOREIGN KEY 約束衝突 - asp.net-core

ASP.NET:INSERT 語句與 FOREIGN KEY 約束衝突

為什麼會出現“ORA-00933:SQL 命令未正確結束”錯誤?

獲取唯一約束失敗:android studio 房間中的 tbl_data.id(Sqlite 代碼 1555 SQLITE_CONSTRAINT_PRIMARYKEY)錯誤

MySQL 錯誤代碼:1452。無法添加或更新子行:外鍵約束失敗

Minizinc 模型失敗並顯示“MiniZinc:內部錯誤:錯誤:求解器後端無法處理約束:float_div”

与FOREIGN KEY约束冲突

SQL FOREIGN KEY的

將嘗試通過打破約束來恢復(但不確定為什麼我的約束是錯誤的)

Django 令牌對象更新錯誤:django.db.utils.IntegrityError:唯一約束失敗:authtoken_token.user_id

為什麼我收到這個錯誤,我試圖修復它,但失敗了

UNIQUE 約束失敗(SQLAlchemy)

“介绍FOREIGN KEY约束”错误

Django的FOREIGN KEY约束失败

使用FOREIGN KEY的SQL语法

為什麼在嘗試安裝 mongoDB 時會出現此錯誤?

為什麼在嘗試保存貓鼬模型時會出現錯誤?

代碼拋出錯誤,寫在結束後但為什麼

為什麼會出現self not defined的錯誤?

為什麼使用 React Hook 表單時表單測試失敗?

即使Foreign_keys为ON,FOREIGN KEY约束也会失败

錯誤:SET FOREIGN_KEY_CHECKS = ON 和 #2014 - 命令不同步;你現在不能運行這個命令

當我嘗試在 Invoice 表上添加外鍵時,為什麼會出現此錯誤?

实体框架级联删除-FOREIGN KEY约束

INSERT语句与FOREIGN KEY约束冲突

GROUP BY foreign_key 和日期范围

如何获得对Foreign_key的访问权限?