介绍
Android默认的数据是SQLite,但SQLite3.6.19之前(在2.2版本中使用的是3.6.22,因此如果你的应用只兼容到2.2版本就可以放心使用外键功能)是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。
现有两张表
- Employees
- Dept
视图
ViewEmps:显示雇员信息和他所在的部门
创建数据库
自定义一个辅助类继承SQLiteOpenHelper类.
- onCreate(SQLiteDatabase db): 当数据库被创建的时候,能够生成表,并创建视图跟触发器。
- onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): 更新的时候可以删除表和创建新的表。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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) { 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) { 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); } } |
加入数据
1
2
3
4
5
6
7
8
9
10
11
|
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();
|
更新数据
1 2 3 4 5 6 7 8 9 10 11 | public int UpdateEmp(Employee emp) { SQLiteDatabase db=this.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put(colName, emp.getName()); cv.put(colAge, emp.getAge()); cv.put(colDept, emp.getDept()); return db.update(employeeTable, cv, colID+"=?", new String []{String.valueOf(emp.getID())}); } |
删除数据
1
2
3
4
5
6
7
|
public
void
DeleteEmp(Employee
emp)
{
SQLiteDatabase
db=this.getWritableDatabase();
db.delete(employeeTable,colID+"=?",
new
String
[]
{String.valueOf(emp.getID())});
db.close();
}
|
取得所有部门信息
1 2 3 4 5 6 7 8 9 | Cursor getAllDepts() { SQLiteDatabase db=this.getReadableDatabase(); Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id, "+colDeptName+" from "+deptTable,new String [] {}); return cur; } |
取得部门内雇员信息
1
2
3
4
5
6
7
8
9
|
public
Cursor
getEmpByDept(String
Dept)
{
SQLiteDatabase
db=this.getReadableDatabase();
String
[]
columns=new
String[]{"_id",colName,colAge,colDeptName};
Cursor
c=db.query(viewEmps,
columns,
colDeptName+"=?",
new
String[]{Dept},
null,
null,
null);
return
c;
}
|
取得部门ID
1
2
3
4
5
6
7
8
9
10
11
|
public
int
GetDeptID(String
Dept)
{
SQLiteDatabase
db=this.getReadableDatabase();
Cursor
c=db.query(deptTable,
new
String[]{colDeptID+"
as _id",colDeptName},
colDeptName+"=?",
new
String[]{Dept},
null,
null,
null);
//Cursor c=db.rawQuery("SELECT "+colDeptID+" as _id FROM "+deptTable+"
//WHERE "+colDeptName+"=?", new String []{Dept});
c.moveToFirst();
return
c.getInt(c.getColumnIndex("_id"));
}
|
上面部门和雇员信息的表因为实现的关联,所以更新和删除都会对对应的信息更新。
原文链接 。