Android SQLite 使用外鍵(Foreign key)

本文介紹如何在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、相關知識

SQLite 外鍵知識

打開Android SQLite 外鍵約束

-----------------------------------------------------------------------------

That's all. Thank you.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章