
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
)
-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE')
INSERT INTO test_main(id, value) VALUES (2, 'TWO')
-- 创建测试子表. ( 注意, 这里要有一个 ON DELETE CASCADE )
CREATE TABLE test_sub (
id INT PRIMARY KEY,
main_id INT REFERENCES test_main(id) ON DELETE CASCADE,
value VARCHAR(10)
)
-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE')
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO')
-- 测试删除主表.
sqlite>DELETE FROM test_main WHERE id = 1
-- 查看 子表数据是否被删除.
sqlite>select * from test_sub
2|2|TWOTWO
介绍:
安卓默认的数据是SQLite,但SQLite3.6.19之前是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。
现有两张表
Employees
Dept
视图
ViewEmps:显示雇员信息和他所在的部门
创建数据库
自定义一个辅助类继承SQLiteOpenHelper类
1.onCreate(SQLiteDatabase db): 当数据库被创建的时候,能够生成表,并创建视图跟触发器。
2.onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): 更新的时候可以删除表和创建新的表。
代码如下:view plain
public class DatabaseHelper extends SQLiteOpenHelper {
static final String dbName="demoDB"
static final String employeeTable="Employees"
static final String colID="EmployeeID"
static final String colName="EmployeeName"
static final String colAge="Age"
static final String colDept="Dept"
static final String deptTable="Dept"
static final String colDeptID="DeptID"
static final String colDeptName="DeptName"
static final String viewEmps="ViewEmps"
构造器
public DatabaseHelper(Context context) {super(context, dbName, null,33)
}
创建库中的表,视图和触发器
public void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stub
db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+
colDeptName+ " TEXT)")
db.execSQL("CREATE TABLE "+employeeTable+"
("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
colName+" TEXT, "+colAge+" Integer, "+colDept+"
INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES
"+deptTable+" ("+colDeptID+"))")
//创建触发器
db.execSQL("CREATE TRIGGER fk_empdept_deptid " +
" BEFORE INSERT "+
" ON "+employeeTable+
" FOR EACH ROW BEGIN"+
" SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"
WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+
" THEN RAISE (ABORT,'Foreign Key Violation') END"+
" END")
//创建视图
db.execSQL("CREATE VIEW "+viewEmps+
" AS SELECT "+employeeTable+"."+colID+" AS _id,"+
" "+employeeTable+"."+colName+","+
" "+employeeTable+"."+colAge+","+
" "+deptTable+"."+colDeptName+""+
" FROM "+employeeTable+" JOIN "+deptTable+
" ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID
)
}
更新库中的表
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS "+employeeTable)
db.execSQL("DROP TABLE IF EXISTS "+deptTable)
db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid")
db.execSQL("DROP VIEW IF EXISTS "+viewEmps)
onCreate(db)
}
加入数据
SQLiteDatabase db=this.getWritableDatabase()ContentValues cv=new ContentValues()
cv.put(colDeptID, 1)
cv.put(colDeptName, "Sales")
db.insert(deptTable, colDeptID, cv)
cv.put(colDeptID, 2)
cv.put(colDeptName, "IT")
db.insert(deptTable, colDeptID, cv)
db.close()
为数据库表添加外键方法(以SqlSever2005数据库为例):
1、新建两张表,一张为主表,一张为副表。主表里的外键就是连接到副表的主键。
2、首先在主表中添加一个外键字段,如下:
3、在主表上右击,选择关系,如下:
4、点击“添加”。
5、再点击上图中标出的位置,如下:
6、图中标出的“主键表”就选择上面的副表。如下:
7、主键表底下的就选择副表的主键,如下:
8、外键表底下的就选择刚才新建的外键字段。如下:
9、再点击“确定”。
10、点击“是”,即可完成外键的添加。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)