Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有一对一关系外键约束的房间数据库失败错误_Java_Android_Foreign Keys_Android Room_One To One - Fatal编程技术网

Java 具有一对一关系外键约束的房间数据库失败错误

Java 具有一对一关系外键约束的房间数据库失败错误,java,android,foreign-keys,android-room,one-to-one,Java,Android,Foreign Keys,Android Room,One To One,我有一个数据库,有两个表,分别是学生表和课程表。我可以在学生表中插入数据,但当我尝试将数据插入课程表时,应用程序崩溃。以下是日志: 2019-01-21 19:56:22.302 28939-29121/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 Process: com.rodroiddev.catalogulinstructoruluiauto, PID: 28939 java.lang.RuntimeException: An err

我有一个数据库,有两个表,分别是学生表和课程表。我可以在学生表中插入数据,但当我尝试将数据插入课程表时,应用程序崩溃。以下是日志:

2019-01-21 19:56:22.302 28939-29121/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.rodroiddev.catalogulinstructoruluiauto, PID: 28939
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:353)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
    at java.util.concurrent.FutureTask.run(FutureTask.java:271)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:50)
    at android.arch.persistence.room.EntityInsertionAdapter.insertAndReturnId(EntityInsertionAdapter.java:114)
    at com.rodroiddev.catalogulinstructoruluiauto.db.CourseDao_Impl.insert(CourseDao_Impl.java:104)
    at com.rodroiddev.catalogulinstructoruluiauto.course.CourseRepository$InsertCourseAsyncTask.doInBackground(CourseRepository.java:53)
    at com.rodroiddev.catalogulinstructoruluiauto.course.CourseRepository$InsertCourseAsyncTask.doInBackground(CourseRepository.java:44)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
    at java.lang.Thread.run(Thread.java:764) 
以下是插入代码:

private static class InsertCourseAsyncTask extends AsyncTask<Course, Void, Void> {
    private CourseDao courseDao;

    public InsertCourseAsyncTask(CourseDao courseDao) {
        this.courseDao = courseDao;
    }

    @Override
    protected Void doInBackground(Course... courses) {
        courseDao.insert(courses[0]);
        return null;
    }
}
公共课{

@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "cId")
public int id;

public String kmStart;

public String  kmStop;

@ColumnInfo(name = "studentId")
public int studentId;

public Course(String kmStart, String kmStop) {

    this.kmStart = kmStart;
    this.kmStop = kmStop;

}

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

public String  getKmStart() {
    return kmStart;
}

public String getKmStop() {
    return kmStop;
}

public void setStudentId(int studentId) {
    this.studentId = studentId;
}

public int getStudentId() {
    return studentId;
}
}

CourseDao

@Dao
公共接口课程{

@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Course... courses);

@Update(onConflict = OnConflictStrategy.IGNORE)
void update(Course course);

@Delete
void delete(Course course);

@Query("DELETE FROM course_table")
void deleteAllCourses();

@Query("SELECT * FROM course_table ORDER BY kmStart ASC")
LiveData<List<Course>> getAllCourses();
}

我希望你能根据我在这里发布的信息帮助我。
谢谢

保存前是否将studentId设置为课程对象?如果不这样做,它将崩溃,因为它将尝试为studentId添加0作为不存在的外键值


将studentId of Course object设置为Student object的id。然后首先保存Student,以便它可以获得id

这是我问题的解决方案。非常感谢你!当我们观察getAllCourses时,如何检索学生数据?循环课程列表,并使用课程对象的studentId检索学生数据。然后,将检索到的学生对象设置为课程对象的私有学生字段。尝试
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Course... courses);

@Update(onConflict = OnConflictStrategy.IGNORE)
void update(Course course);

@Delete
void delete(Course course);

@Query("DELETE FROM course_table")
void deleteAllCourses();

@Query("SELECT * FROM course_table ORDER BY kmStart ASC")
LiveData<List<Course>> getAllCourses();