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 + ");");
}
}