介绍:
安卓默认的数据是SQLite,但SQLite3.6.19之前是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。
现有两张表
Employees
- Dept
视图
ViewEmps :显示雇员信息和他所在的部门
创建数据库
自定义一个辅助类继承SQLiteOpenHelper类 1.
onCreate(SQLiteDatabase db):当数据库被创建的时候,能够生成表,并创建视图跟触发器。
2.
onUpgrade(SQLiteDatabse db,int oldVersion,int newVersion):更新的时候可以删除表和创建新的表。
代码如下:
[java]
view plain
copy
- publicclassDatabaseHelperextendsSQLiteOpenHelper{
-
- staticfinalStringdbName="demoDB";
- finalStringemployeeTable="Employees";
- finalStringcolID="EmployeeID";
- finalStringcolName="EmployeeName";
- finalStringcolAge="Age";
- finalStringcolDept="Dept";
-
- finalStringdeptTable="Dept";
- finalStringcolDeptID="DeptID";
- finalStringcolDeptName="DeptName";
- finalStringviewEmps="ViewEmps";
构造器
copy
publicDatabaseHelper(Contextcontext){
- super(context,dbName,null,33);
- }
创建库中的表,视图和触发器
copy
voidonCreate(SQLiteDatabasedb){
-
- db.execSQL("CREATETABLE"+deptTable+"("+colDeptID+"INTEGERPRIMARYKEY,"+
- colDeptName+"TEXT)");
- db.execSQL("CREATETABLE"+employeeTable+"
- ("+colID+"INTEGERPRIMARYKEYAUTOINCREMENT,"+
- colName+"TEXT,"+colAge+"Integer,"+colDept+"
- INTEGERNOTNULL,FOREIGNKEY("+colDept+")REFERENCES
- "+deptTable+"("+colDeptID+"));");
-
- db.execSQL("CREATETRIGGERfk_empdept_deptid"+
- "BEFOREINSERT"+
- "ON"+employeeTable+
- "FOREACHROWBEGIN"+
- "SELECTCASEWHEN((SELECT"+colDeptID+"FROM"+deptTable+"
- WHERE"+colDeptID+"=new."+colDept+")ISNULL)"+
- "THENRAISE(ABORT,'ForeignKeyViolation')END;"+
- "END;");
- //创建视图
- db.execSQL("CREATEVIEW"+viewEmps+
- "ASSELECT"+employeeTable+"."+colID+"AS_id,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ""+employeeTable+"."+colName+","+
- ""+employeeTable+"."+colAge+",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ""+deptTable+"."+colDeptName+""+
- "FROM"+employeeTable+"JOIN"+deptTable+
- "ON"+employeeTable+"."+colDept+"="+deptTable+"."+colDeptID
- );
- }
更新库中的表
copy
voidonUpgrade(SQLiteDatabasedb,153); background-color:inherit; font-weight:bold">intoldVersion,153); background-color:inherit; font-weight:bold">intnewVersion){
- db.execSQL("DROPTABLEIFEXISTS"+employeeTable);
- db.execSQL("DROPTABLEIFEXISTS"+deptTable);
- db.execSQL("DROPTRIGGERIFEXISTSfk_empdept_deptid");
- db.execSQL("DROPVIEWIFEXISTS"+viewEmps);
- onCreate(db);
- }
加入数据
[java]
view plain
copy
- SQLiteDatabasedb=this.getWritableDatabase();
- ContentValuescv=newContentValues();
- cv.put(colDeptID,1);
- cv.put(colDeptName,"Sales");
- db.insert(deptTable,colDeptID,cv);
-
- 2);
- "IT");
- db.close();
更新数据
copy
intUpdateEmp(Employeeemp)
- {
- SQLiteDatabasedb= cv.put(colName,emp.getName());
- cv.put(colAge,emp.getAge());
- cv.put(colDept,emp.getDept());
- returndb.update(employeeTable,cv,colID+"=?",
- newString[]{String.valueOf(emp.getID())});
- }
删除数据
copy
voidDeleteEmp(Employeeemp)
- db.delete(employeeTable,colID+"=?",153); background-color:inherit; font-weight:bold">newString[]{String.valueOf(emp.getID())});
- db.close();
- }
取得所有部门信息
copy
CursorgetAllDepts()
- this.getReadableDatabase();
- Cursorcur=db.rawQuery("SELECT"+colDeptID+"as_id,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> "+colDeptName+"from"+deptTable,153); background-color:inherit; font-weight:bold">newString[]{});
- returncur;
- }
取得部门内雇员信息
copy
publicCursorgetEmpByDept(StringDept)
- String[]columns=newString[]{"_id",colName,colAge,colDeptName};
- Cursorc=db.query(viewEmps,columns,colDeptName+"=?",
- newString[]{Dept},153); background-color:inherit; font-weight:bold">null);
- returnc;
- }
取得部门ID
copy
intGetDeptID(StringDept)
- Cursorc=db.query(deptTable,newString[]{colDeptID+"as_id",colDeptName},108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> colDeptName+"=?",153); background-color:inherit; font-weight:bold">null);
- //Cursorc=db.rawQuery("SELECT"+colDeptID+"as_idFROM"+deptTable+"
- //WHERE"+colDeptName+"=?",newString[]{Dept});
- c.moveToFirst();
- returnc.getInt(c.getColumnIndex("_id"));
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|