Android[高级教程] Android数据库SQLite表内设置外键

本文出自:http://blog.csdn.net/kangkangz4/article/details/7003659


安卓默认的数据是SQLite,但SQLite3.6.19之前是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。

现有两张表

  1. Employees
  2. Dept

视图

  1. ViewEmps:显示雇员信息和他所在的部门

创建数据库

自定义一个辅助类继承SQLiteOpenHelper

1. onCreate(SQLiteDatabase db)当数据库被创建的时候,能够生成表,并创建视图跟触发器。
2. onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion)更新的时候可以删除表和创建新的表。
代码如下:
  1. public class DatabaseHelper extends SQLiteOpenHelper {  
  2.   
  3. static final String dbName="demoDB";  
  4. static final String employeeTable="Employees";  
  5. static final String colID="EmployeeID";  
  6. static final String colName="EmployeeName";  
  7. static final String colAge="Age";  
  8. static final String colDept="Dept";  
  9.   
  10. static final String deptTable="Dept";  
  11. static final String colDeptID="DeptID";  
  12. static final String colDeptName="DeptName";  
  13.   
  14. static final String viewEmps="ViewEmps";  
构造器
  1. public DatabaseHelper(Context context) {  
  2.   super(context, dbName, null,33);   
  3.   }  
创建库中的表,视图和触发器
  1. public void onCreate(SQLiteDatabase db) {  
  2.   // TODO Auto-generated method stub  
  3.     
  4.   db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+  
  5.     colDeptName+ " TEXT)");  
  6.     
  7.   db.execSQL("CREATE TABLE "+employeeTable+"   
  8.     ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+  
  9.         colName+" TEXT, "+colAge+" Integer, "+colDept+"   
  10.     INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES   
  11.     "+deptTable+" ("+colDeptID+"));");  
  12.     
  13.   //创建触发器  
  14.   db.execSQL("CREATE TRIGGER fk_empdept_deptid " +  
  15.     " BEFORE INSERT "+  
  16.     " ON "+employeeTable+  
  17.       
  18.     " FOR EACH ROW BEGIN"+  
  19.     " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"   
  20.     WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+  
  21.     " THEN RAISE (ABORT,'Foreign Key Violation') END;"+  
  22.     "  END;");  
  23.   
  24.  //创建视图  
  25.   db.execSQL("CREATE VIEW "+viewEmps+  
  26.     " AS SELECT "+employeeTable+"."+colID+" AS _id,"+  
  27.     " "+employeeTable+"."+colName+","+  
  28.     " "+employeeTable+"."+colAge+","+  
  29.     " "+deptTable+"."+colDeptName+""+  
  30.     " FROM "+employeeTable+" JOIN "+deptTable+  
  31.     " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID  
  32.     );  
  33.  }  

更新库中的表
  1. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  2.   // TODO Auto-generated method stub  
  3.     
  4.   db.execSQL("DROP TABLE IF EXISTS "+employeeTable);  
  5.   db.execSQL("DROP TABLE IF EXISTS "+deptTable);  
  6.   
  7.   db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid");  
  8.   db.execSQL("DROP VIEW IF EXISTS "+viewEmps);  
  9.   onCreate(db);  
  10.  }  

加入数据
  1. SQLiteDatabase db=this.getWritableDatabase();  
  2.  ContentValues cv=new ContentValues();  
  3.    cv.put(colDeptID, 1);  
  4.    cv.put(colDeptName, "Sales");  
  5.    db.insert(deptTable, colDeptID, cv);  
  6.   
  7.    cv.put(colDeptID, 2);  
  8.    cv.put(colDeptName, "IT");  
  9.    db.insert(deptTable, colDeptID, cv);  
  10.                      db.close();  

更新数据
  1. public int UpdateEmp(Employee emp)  
  2.   {  
  3.    SQLiteDatabase db=this.getWritableDatabase();  
  4.    ContentValues cv=new ContentValues();  
  5.    cv.put(colName, emp.getName());  
  6.    cv.put(colAge, emp.getAge());  
  7.    cv.put(colDept, emp.getDept());  
  8.    return db.update(employeeTable, cv, colID+"=?",   
  9.     new String []{String.valueOf(emp.getID())});     
  10.   }  

删除数据
  1. public void DeleteEmp(Employee emp)  
  2.   {  
  3.    SQLiteDatabase db=this.getWritableDatabase();  
  4.    db.delete(employeeTable,colID+"=?"new String [] {String.valueOf(emp.getID())});  
  5.    db.close();  
  6.   }  

取得所有部门信息
  1. Cursor getAllDepts()  
  2.   {  
  3.    SQLiteDatabase db=this.getReadableDatabase();  
  4.    Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id,   
  5.     "+colDeptName+" from "+deptTable,new String [] {});  
  6.      
  7.    return cur;  
  8.   }  

取得部门内雇员信息
  1. public Cursor getEmpByDept(String Dept)  
  2.   {  
  3.    SQLiteDatabase db=this.getReadableDatabase();  
  4.    String [] columns=new String[]{"_id",colName,colAge,colDeptName};  
  5.    Cursor c=db.query(viewEmps, columns, colDeptName+"=?",   
  6.     new String[]{Dept}, nullnullnull);  
  7.    return c;  
  8.   }  

取得部门ID
  1. public int GetDeptID(String Dept)  
  2.   {  
  3.    SQLiteDatabase db=this.getReadableDatabase();  
  4.    Cursor c=db.query(deptTable, new String[]{colDeptID+" as _id",colDeptName},  
  5.     colDeptName+"=?"new String[]{Dept}, nullnullnull);  
  6.    //Cursor c=db.rawQuery("SELECT "+colDeptID+" as _id FROM "+deptTable+"   
  7.    //WHERE "+colDeptName+"=?", new String []{Dept});  
  8.    c.moveToFirst();  
  9.    return c.getInt(c.getColumnIndex("_id"));    
  10.   }  

上面部门和雇员信息的表因为实现的关联,所以更新和删除都会对对应的信息更新。
原网页: http://www.codeproject.com/KB/android/AndroidSQLite.aspx#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值