Tôi đang cố gắng thiết kế và triển khai cấu trúc cây thư mục trong Android SQLite với sự trợ giúp của Android Room Persistence (một ORM) mà Google đã giới thiệu trong I/O 2017. Trong thiết kế của tôi, một thư mục có thể chứa một thư mục và tệp khác. Dưới đây là mã của tôi cho thư mục và tập tin:Android Room NGOÀI KEY ràng buộc không thành công
file mẫu:
@Entity(tableName = "files", foreignKeys = @ForeignKey(entity = Folder.class,
parentColumns = "id",
childColumns = "parent_id",
onDelete = CASCADE))
public class File {
@PrimaryKey(autoGenerate = true)
private int id;
private String title;
private Date creationDate;
@ColumnInfo(name = "parent_id")
public int parentId;
//here setters and getters skipped but exist in original code
}
Và đây là thư mục Code:
@Entity(tableName = "folders", foreignKeys = @ForeignKey(entity = Folder.class,
parentColumns = "id",
childColumns = "parent_id",
onDelete = CASCADE,onUpdate = SET_NULL))
public class Folder {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
@ColumnInfo(name = "parent_id")
private int parentId;
}
nào có một khoá ngoại trên cột ID của nó tự cho mẹ .
và đây là FolderDAO:
@Dao
public interface FolderDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertFolder(Folder... folders);
@Update
public void updateFolder(Folder... folders);
@Delete
public void deleteFolders(Folder... folders);
@Query("SELECT * FROM folders")
List<Folder> getAll();
@Query("SELECT * FROM folders WHERE id IN (:folderIds)")
List<Folder> loadAllByIds(int[] folderIds);
}
Nhưng khi tôi thực hiện một đối tượng thư mục và cố gắng chèn nó:
AsyncTask.execute(new Runnable() {
@Override
public void run() {
Folder folder = new Folder();
folder.setName("All");
DatabaseInstance.getInstance(getApplicationContext()).folderDAO().insertFolder(folder);
}
});
nhận được lỗi này:
NƯỚC NGOÀI chế KEY thất bại
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: sahraei.hamidreza.com.note, PID: 1835
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:80)
at android.arch.persistence.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:80)
at sahraei.hamidreza.com.note.DAO.FolderDAO_Impl.insertFolder(FolderDAO_Impl.java:80)
at sahraei.hamidreza.com.note.ItemListActivity$1.run(ItemListActivity.java:62)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
D oes bất cứ ai biết những gì sai hoặc đề xuất một thiết kế cho bảng dự án của tôi?
"Tôi làm cho một đối tượng thư mục và cố gắng chèn nó "- hãy chỉnh sửa câu hỏi của bạn và đăng mã này, cùng với dấu vết ngăn xếp Java hoàn chỉnh. – CommonsWare
@CommonsWare Edited. –
Bạn chưa chỉ định thư mục gốc và dự đoán của tôi là điều đang kích hoạt lỗi này. Tất nhiên, bạn * không thể * chỉ định một thư mục cha cho thư mục đầu tiên, vì không có cha mẹ trỏ đến. [Các khóa ngoài tự tham chiếu hoạt động trong SQLite] (https://stackoverflow.com/q/15967146/115145), mặc dù có vẻ như [bạn cần sử dụng 'NULL' một cách rõ ràng cho giá trị khi thiếu] (https: //stackoverflow.com/a/6518551/115145). Tôi không biết Room tạo ra gì cho câu lệnh 'INSERT' ở đây. – CommonsWare