Android SQLite Database with Relationship Tables การสร้างตารางที่มีหลายตารางและมีความสัมพันธ์กัน
มาดูตัวอย่างโค้ด Android ที่มีหลาย ๆ Table แล้วแต่ละ Table มีความสัมพันธ์กัน
ก่อนอื่นเราก็ต้องมาทำการ list รายชื่อตารางและคอมลัมน์ออกมาก่อน ดังตัวอย่าง
// WORD_GROUP_TABLE public static final String TABLE_WORDS_GROUP = "WORDS_GROUP"; public static final String COL_TABLE_WORD_GROUP_ID = "ID"; public static final String COL_TABLE_WORD_GROUP_EN = "GROUP_EN"; public static final String COL_TABLE_WORD_GROUP_TH = "GROUP_TH"; // WORD_ITEMS_TABLE public static final String TABLE_WORDS_ITEMS = "WORDS_ITEMS"; public static final String COL_TABLE_WORD_ITEMS_ID = "ID"; public static final String COL_TABLE_WORD_ITEMS_EN = "ITEM_EN"; public static final String COL_TABLE_WORD_ITEMS_TH = "ITEM_TH"; public static final String COL_TABLE_WORD_ITEMS_GROUP_REFERENCES = "ITEM_GROUP";
จากตัวอย่างข้างต้นเราจะสร้าง Table ขึ้นมา 2 Table ที่ชื่อว่า WORDS_GROUP และ WORDS_ITEMS ซึ่งจะมีความสัมพันธ์คือให้คอลัมน์ ITEM_GROUP ชี้ไปที่ ID ของ WORD_GROUP
เมื่อได้แล้ว เราก็ต้องทำการ สร้างตารางโดยเอาโค้ดไว้ในส่วน onCreate ดังตัวอย่างโค้ด
db.execSQL("CREATE TABLE " + TABLE_WORDS_GROUP +" (" + COL_TABLE_WORD_GROUP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_TABLE_WORD_GROUP_EN + " TEXT, " + COL_TABLE_WORD_GROUP_TH + " TEXT);" ); db.execSQL("CREATE TABLE " + TABLE_WORDS_ITEMS + " (" + COL_TABLE_WORD_ITEMS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_TABLE_WORD_ITEMS_EN + " TEXT, " + COL_TABLE_WORD_ITEMS_TH + " TEXT, " + COL_TABLE_WORD_ITEMS_GROUP_REFERENCES + " INTEGER, " + "FOREIGN KEY(" + COL_TABLE_WORD_ITEMS_GROUP_REFERENCES + ") REFERENCES " + TABLE_WORDS_GROUP + "(" + COL_TABLE_WORD_GROUP_ID + "));" );
จากตัวอย่างโค้ดเราจะสร้างตารางโดย ใช้ Query จากนั้นก็ให้เราเพิ่มข้อมูลเข้าไปได้เลย
ดูตัวอย่างเต็ม ๆ ไฟล์ได้ตามโค้ดด้านล่าง
package com.doesystem.educate.englishwords.database; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by Doe on 2/25/2016. */ public class DBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "DOE_WORDS"; private static final int DB_VERSION = 6; // WORD_GROUP_TABLE public static final String TABLE_WORDS_GROUP = "WORDS_GROUP"; public static final String COL_TABLE_WORD_GROUP_ID = "ID"; public static final String COL_TABLE_WORD_GROUP_EN = "GROUP_EN"; public static final String COL_TABLE_WORD_GROUP_TH = "GROUP_TH"; // WORD_ITEMS_TABLE public static final String TABLE_WORDS_ITEMS = "WORDS_ITEMS"; public static final String COL_TABLE_WORD_ITEMS_ID = "ID"; public static final String COL_TABLE_WORD_ITEMS_EN = "ITEM_EN"; public static final String COL_TABLE_WORD_ITEMS_TH = "ITEM_TH"; public static final String COL_TABLE_WORD_ITEMS_GROUP_REFERENCES = "ITEM_GROUP"; public DBHelper(Context context){ super(context, DB_NAME, null, DB_VERSION); } public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_WORDS_GROUP +" (" + COL_TABLE_WORD_GROUP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_TABLE_WORD_GROUP_EN + " TEXT, " + COL_TABLE_WORD_GROUP_TH + " TEXT);" ); db.execSQL("CREATE TABLE " + TABLE_WORDS_ITEMS + " (" + COL_TABLE_WORD_ITEMS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_TABLE_WORD_ITEMS_EN + " TEXT, " + COL_TABLE_WORD_ITEMS_TH + " TEXT, " + COL_TABLE_WORD_ITEMS_GROUP_REFERENCES + " INTEGER, " + "FOREIGN KEY(" + COL_TABLE_WORD_ITEMS_GROUP_REFERENCES + ") REFERENCES " + TABLE_WORDS_GROUP + "(" + COL_TABLE_WORD_GROUP_ID + "));" ); insertDataToTable(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS_GROUP); db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS_ITEMS); onCreate(db); } String[][] dataGroup = new String[][]{ {"Body", "ร่างกาย"}, {"Internal Organs", "อวัยวะภายในร่างกาย"}, {"Family", "ครอบครัว"}, {"House and Around the House", "บ้านและรอบ ๆ บ้าน"}, {"Bedroom", "ห้องนอน"}, {"In the House", "ของใช้ในบ้าน"} }; String[][][] dataItems = new String[][][]{ { {"abdomen", "ท้อง"}, {"ankle", "ข้อเท้า"}, {"arm", "แขน"}, {"armpit", "รักแร้"}, {"back", "หลัง (ส่วนของร่างกาย)"}, {"bone", "กระดูก"}, {"bottom", "ก้น"}, {"cheek", "แก้ม"}, {"chest", "หน้าอก"}, {"chin", "คาง"} }, { {"adrenal gland", "ต่อมหมวกไต"}, {"anus", "ทวารหนัก"}, {"appendix", "ไส้ติ่ง"}, {"artery", "เส้นเลือดแดงที่นำเลือดแดงออกจากหัวใจ"}, {"bladder", "กระเพาะปัสสาวะ"} }, { {"ancestor", "บรรพบุรุษ"} }, { {"attic", "ห้องใต้หลังคา"} }, { {"alarm clock", "นาฬิกาปลุก"} }, { {"air-conditioner", "เครื่องปรับอากาศ"}, {"aquarium", "ตู้ปลา"} } }; private void insertDataToTable(SQLiteDatabase db){ for(int i = 0; i < dataGroup.length; i++){ insertToWordsGroupTable(db, dataGroup[i][0], dataGroup[i][1]); for(int j = 0; j < dataItems[i].length; j++){ insertToWordsItemsTable(db, dataItems[i][j][0], dataItems[i][j][1], i + 1); } } } private void insertToWordsGroupTable(SQLiteDatabase db, String groupEn, String groupTh){ db.execSQL("INSERT INTO " + TABLE_WORDS_GROUP + " VALUES (null, '" + groupEn + "', '" + groupTh + "');"); } private void insertToWordsItemsTable(SQLiteDatabase db, String itemEn, String itemTh, int groupId){ db.execSQL("INSERT INTO " + TABLE_WORDS_ITEMS + " VALUES (null, '" + itemEn + "', '" + itemTh + "', " + groupId + ");"); } }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น