我不明白這個錯誤,我有兩個實體任務和項目,一個任務分配給一個項目(見下面的代碼)。
但是當我想測試添加一個任務時,我有這個錯誤: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] 删除。
我来说两句