I followed this post Android Room FOREIGN KEY constraint failed (code 787). Unfortunately, it not works in my case.
I always get the error when trying to insert a new Note. Of course, there is a Topic existed in Database.
Do you guys have any idea?
Please take a look at my code below.
Topic:
@Entity(tableName = "topic")
data class Topic(@PrimaryKey var id: Long? = null,
@ColumnInfo(name = "name") var name: String,
@ColumnInfo(name = "note_count") var noteCount: Int = 0,
@ColumnInfo(name = "view_count") var viewCount: Long = 0) : Serializable {
@Ignore
var notes: List<Note>? = null
}
Note:
@Entity(tableName = "note",
foreignKeys = arrayOf(ForeignKey(entity = Topic::class,
parentColumns = arrayOf("id"), childColumns = arrayOf("topic_id"), onDelete = ForeignKey.CASCADE)))
@TypeConverters(TimestampConverter::class)
data class Note(@PrimaryKey(autoGenerate = true) var noteId: Long? = null,
@ColumnInfo(name = "topic_id") var topicId: Long? = null,
@ColumnInfo(name = "title") var title: String,
@ColumnInfo(name = "caption") var caption: String? = "",
@ColumnInfo(name = "created_at") var createdAt: Date? = null) : Serializable {
}
NoteDao:
@Dao
interface NoteDao {
@Query("SELECT * from note")
fun getAll(): LiveData<List<Note>>
@Insert(onConflict = REPLACE)
fun insert(note: Note)
@Query("DELETE from note")
fun deleteAll()
@Delete
fun delete(category: Note)
@Query("SELECT * FROM note WHERE title = :title COLLATE NOCASE LIMIT 1")
fun findNoteByTitle(title: String): Note?
@Query("SELECT * FROM note WHERE topic_id = :topicId")
fun findNotesByTopicId(topicId: Long): LiveData<List<Note>>
@Query("SELECT count(*) FROM note WHERE topic_id = :topicId")
fun countNotesByTopicId(topicId: Long): Long
@Update(onConflict = IGNORE)
fun update(category: Note)
}
(@PrimaryKey var id: Long? = null,
looks like a problem. Primary key can't be nullI found the problem. Because I have been created 2 different Databases: TopicDataBase and NoteDataBase.
So I just need to remove 1 of them. My bad >"<