本文介紹如何在Android SQLite中使用外鍵 (foreign key) 實現 —— 刪除主表某一行時自動刪除子表關聯內容。
前提:android SQLite 數據庫已建立 ,主表 CourseInfo,子表OriginalSchedule。
目標:定義子表OriginalSchedule 的列 COLUMN_COURSE_ID爲 外鍵(foreign key),關聯CourseInfo 主鍵_ID。當刪除CourseInfo 某一行時同時刪除 OriginalSchedule 中的關聯行 。
1、主表Course和子表OriginalSchedule的定義
public class TestDbHelper extends SQLiteOpenHelper {
……
@Override public void onCreate(SQLiteDatabase sqLiteDatabase)
{
// Create a table to hold Characters' learning status and display sequence.
Log.v(LOG_TAG, "TestDbHelper onCreate");
final String SQL_CREATE_COURSE_INFO_TABLE = "CREATE TABLE " + CourseInfo.TABLE_NAME + " (" +
CourseInfo._ID + " INTEGER PRIMARY KEY NOT NULL, " +
CourseInfo.COLUMN_NUMBER_OF_CLASSES + " INTEGER NOT NULL);";
final String SQL_CREATE_ORIGINAL_SCHEDULE_TABLE = "CREATE TABLE " + OriginalSchedule.TABLE_NAME + " (" +
OriginalSchedule._ID + " INTEGER PRIMARY KEY NOT NULL, " +
OriginalSchedule.COLUMN_COURSE_ID + " INTEGER NOT NULL,+
OriginalSchedule.COLUMN_SEQUENCE_ID + " INTEGER NOT NULL" +
");";
……
}
2、 定義OriginalSchedule中的外鍵(foreign key)
final String SQL_CREATE_ORIGINAL_SCHEDULE_TABLE = "CREATE TABLE " + OriginalSchedule.TABLE_NAME + " (" +
OriginalSchedule._ID + " INTEGER PRIMARY KEY NOT NULL, " +
OriginalSchedule.COLUMN_COURSE_ID + " INTEGER NOT NULL REFERENCES " + CourseInfo.TABLE_NAME + "(" +CourseInfo._ID + ") ON DELETE CASCADE,"+
OriginalSchedule.COLUMN_SEQUENCE_ID + " INTEGER NOT NULL" +
");";
或者
final String SQL_CREATE_ORIGINAL_SCHEDULE_TABLE = "CREATE TABLE " + OriginalSchedule.TABLE_NAME + " (" + OriginalSchedule._ID + " INTEGER PRIMARY KEY NOT NULL, " +
OriginalSchedule.COLUMN_COURSE_ID + " INTEGER NOT NULL, " +
OriginalSchedule.COLUMN_SEQUENCE_ID + " INTEGER NOT NULL," +
"FOREIGN KEY("+ OriginalSchedule.COLUMN_COURSE_ID +") REFERENCES " + CourseInfo.TABLE_NAME + "(" +CourseInfo._ID + ") ON DELETE CASCADE);";
3、打開SQLite 外鍵開關
在TestDbHelper 中重寫onOpen,打開外鍵開關。
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if(!db.isReadOnly()) {
//Enable foreign key constraints
Log.e(LOG_TAG,"open foreign_key");
db.execSQL("PRAGMA foreign_keys = ON;");
}
}
代碼修改結束。
4、相關知識
-----------------------------------------------------------------------------
That's all. Thank you.