Android数据库SQLite表内设置外键

介绍

Android默认的数据是SQLite,但SQLite3.6.19之前(在2.2版本中使用的是3.6.22,因此如果你的应用只兼容到2.2版本就可以放心使用外键功能)是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。

现有两张表

  • Employees
  • Dept

视图

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

创建数据库

自定义一个辅助类继承SQLiteOpenHelper类.

  1. onCreate(SQLiteDatabase db): 当数据库被创建的时候,能够生成表,并创建视图跟触发器。
  2. onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): 更新的时候可以删除表和创建新的表。

代码如下:

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);  
     }  
}Create(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);  
     }  
}

加入数据

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();insert(deptTable, colDeptID, cv);  

   cv.put(colDeptID, 2);  
   cv.put(colDeptName, "IT");  
   db.insert(deptTable, colDeptID, cv);  
                     db.close();

更新数据

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())});     
  } 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())});     
  }

删除数据

public void DeleteEmp(Employee emp)  
  {  
   SQLiteDatabase db=this.getWritableDatabase();  
   db.delete(employeeTable,colID+"=?", new String [] {String.valueOf(emp.getID())});  
   db.close();  
  } void DeleteEmp(Employee emp)  
  {  
   SQLiteDatabase db=this.getWritableDatabase();  
   db.delete(employeeTable,colID+"=?", new String [] {String.valueOf(emp.getID())});  
   db.close();  
  }

取得所有部门信息

Cursor getAllDepts()  
  {  
   SQLiteDatabase db=this.getReadableDatabase();  
   Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id,   
    "+colDeptName+" from "+deptTable,new String [] {});  

   return cur;  
  }SELECT "+colDeptID+" as _id,   
    "+colDeptName+" from "+deptTable,new String [] {});  

   return cur;  
  }

取得部门内雇员信息

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;  
  } 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

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

上面部门和雇员信息的表因为实现的关联,所以更新和删除都会对对应的信息更新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值