zoukankan      html  css  js  c++  java
  • DB

    前言:

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

    example代码:

    两张表

    1. Employees
    2. Dept

    关系图:

    example

    创建数据库:

    自定义一个辅助类继承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);  

          } 

    //加入数据

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

    //更新数据

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

        } 

    //删除数据
      public 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;  

        } 

    //取得部门内雇员信息

      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

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

         } 

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

     

     

    你必须非常努力,才能看起来毫不费力。。。
  • 相关阅读:
    LTE信令流程之Service Request流程介绍
    LTE信令流程之TAU流程介绍
    LTE信令流程之开机附着、去附着流程分析
    Python 数据分析之可视化工具
    LTE信令流程之切换流程介绍
    js获取昨天日期
    在dll中使用 DirectSound,编译能通过,但会出现内存问题,而且不能发声
    在dll中用DirectSound8同时播放多个wav文件不能发声
    第二次作业
    第三次作业
  • 原文地址:https://www.cnblogs.com/yiweiaimeng/p/4940538.html
Copyright © 2011-2022 走看看