i've just started android. i've tried insert data to my database using Room database. but that gave me error that android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787) or columns of foreign table of database were empty.
This is my room
@Entity(tableName = "memoTable") public class User {
@PrimaryKey(autoGenerate = true) //Room에서 자동으로 id를 할당
private int id;
@ColumnInfo(name = "title") //열이름을 다르게 지음
private String title;
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "date")
private String date;
@Embedded
public Playlist playlist; //테이블 내의 하위 필드로 분해하려고 하는 객체
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
@Entity(tableName = "playlist", foreignKeys = @ForeignKey(entity = User.class, parentColumns = "id", childColumns = "userCreatorId", onDelete = CASCADE)) public class Playlist {
@PrimaryKey(autoGenerate = true)
public int playlistId;
@ColumnInfo(name = "userCreatorId")
public int userCreatorId;
@ColumnInfo(name = "playlistname")
public String playlistname;
public int getPlaylistId() {
return playlistId;
}
public void setPlaylistId(int playlistId) {
this.playlistId = playlistId;
}
public int getUserCreatorId() {
return userCreatorId;
}
public void setUserCreatorId(int userCreatorId) {
this.userCreatorId = userCreatorId;
}
public String getPlaylistname() {
return playlistname;
}
public String setPlaylistname(String playlistname) {
this.playlistname = playlistname;
return playlistname;
}
@Override
public String toString() {
return "Playlist{" +
"playlistId=" + playlistId +
", userCreatorId=" + userCreatorId +
", playlistname='" + playlistname + '\'' +
'}';
}
}
public class UserAndPlay{
@Embedded
public User user;
@Relation(
parentColumn = "id",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
this is my database code
@Database(entities = {User.class, Playlist.class}, version = 3, exportSchema = false)
public abstract class Appdatabase extends RoomDatabase {
public abstract UserDao userDao();
private static Appdatabase instance = null;
public static synchronized Appdatabase getInstance(Context context){
if(instance == null){
instance =
Room.databaseBuilder(context.getApplicationContext(),Appdatabase.class,"memo_Database")
.allowMainThreadQueries()
.addMigrations(MIGRATION_1_2)
.addMigrations(MIGRATION_2_3)
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
static final Migration MIGRATION_1_2 = new Migration(1,2){
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE memoTable" + " ADD COLUMN description TEXT DEFAULT 0"
);
}
};
static final Migration MIGRATION_2_3 = new Migration(2,3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS 'playlist' " + " ( 'playlistId' INTEGER PRIMARY
KEY AUTOINCREMENT NOT NULL, " +
" 'userCreatorId' INTEGER , 'playlistname' TEXT DEFAULT 0, FOREIGN KEY
('userCreatorId') REFERENCES 'memoTable'('id') ON DELETE CASCADE" +
" )");
}
};
}
And this is my java code
@Override
public void onBackPressed() { // 뒤로가기 클릭 시
String title = mMemoWriteBind.editTitle.getText().toString();
String description = mMemoWriteBind.editDescription.getText().toString();
String currentData = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
// 인스턴스 in database
user.setTitle(title);
user.setDescription(description);
user.setDate(currentData);
//ERROR
playlist.setPlaylistname(title);
playlist.setUserCreatorId(user.getId());
db.userDao().insertPlayList(playlist);
db.userDao().insert(user);
//TODO 외래키의 무결성에 대해서 배워보자
Toast.makeText(getApplicationContext(), "메모 저장", Toast.LENGTH_SHORT).show();
mMemoWriteBind.textTitle.setText(title);// 표시된 Text를 textView에 넣어줌
mMemoWriteBind.textDescription.setText(description);
mMemoWriteBind.textDate.setText(currentData);
mMemoWriteBind.editTitle.setVisibility(View.INVISIBLE); // edittext 가리기
mMemoWriteBind.editDescription.setVisibility(View.INVISIBLE);
mMemoWriteBind.textTitle.setVisibility(View.VISIBLE); //저장 클릭 후 textView visible
mMemoWriteBind.textDescription.setVisibility(View.VISIBLE);
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
startActivity(intent);
finish();
super.onBackPressed();
}