0

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();

}
  • Does this answer your question? [Android Room FOREIGN KEY constraint failed](https://stackoverflow.com/questions/44633483/android-room-foreign-key-constraint-failed) – Zain Jan 21 '21 at 02:17
  • Yeah, i referenced you sent. but basically, i have no idea that where i wrote the wrong code and what problem is in my code. could you let me know? sir?..please – 동네한바퀴 Jan 21 '21 at 09:26

0 Answers0