1. 程式人生 > >SQLite3 觸發器、檢視的案例

SQLite3 觸發器、檢視的案例

介紹:

安卓預設的資料是SQLite,但SQLite3.6.19之前是不支援外來鍵的,如果有兩張表需要關聯,用外來鍵是最省事的,但不支援的話怎麼辦呢?這裡就有一個解決辦法,就是用事務將兩張表關聯起來,並且最後生成一張檢視。

現有兩張表

  1. Employees
  2. Dept

檢視

  1. ViewEmps:顯示僱員資訊和他所在的部門

建立資料庫

自定義一個輔助類繼承SQLiteOpenHelper

1.onCreate(SQLiteDatabase db)當資料庫被建立的時候,能夠生成表,並建立檢視跟觸發器。
2.onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion)
更新的時候可以刪除表和建立新的表。 程式碼如下:
  1. publicclass DatabaseHelper extends SQLiteOpenHelper {  
  2. staticfinal String dbName="demoDB";  
  3. staticfinal String employeeTable="Employees";  
  4. staticfinal String colID="EmployeeID";  
  5. staticfinal String colName="EmployeeName";  
  6. staticfinal String colAge="Age";  
  7. staticfinal
     String colDept="Dept";  
  8. staticfinal String deptTable="Dept";  
  9. staticfinal String colDeptID="DeptID";  
  10. staticfinal String colDeptName="DeptName";  
  11. staticfinal 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.   db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+  
  4.     colDeptName+ " TEXT)");  
  5.   db.execSQL("CREATE TABLE "+employeeTable+"   
  6.     ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+  
  7.         colName+" TEXT, "+colAge+" Integer, "+colDept+"   
  8.     INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES   
  9.     "+deptTable+" ("+colDeptID+"));");  
  10.   //建立觸發器
  11.   db.execSQL("CREATE TRIGGER fk_empdept_deptid " +  
  12.     " BEFORE INSERT "+  
  13.     " ON "+employeeTable+  
  14.     " FOR EACH ROW BEGIN"+  
  15.     " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"   
  16.     WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+  
  17.     " THEN RAISE (ABORT,'Foreign Key Violation') END;"+  
  18.     "  END;");  
  19.  //建立檢視
  20.   db.execSQL("CREATE VIEW "+viewEmps+  
  21.     " AS SELECT "+employeeTable+"."+colID+" AS _id,"+  
  22.     " "+employeeTable+"."+colName+","+  
  23.     " "+employeeTable+"."+colAge+","+  
  24.     " "+deptTable+"."+colDeptName+""+  
  25.     " FROM "+employeeTable+" JOIN "+deptTable+  
  26.     " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID  
  27.     );  
  28.  }  

更新庫中的表
  1. publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  2.   // TODO Auto-generated method stub
  3.   db.execSQL("DROP TABLE IF EXISTS "+employeeTable);  
  4.   db.execSQL("DROP TABLE IF EXISTS "+deptTable);  
  5.   db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid");  
  6.   db.execSQL("DROP VIEW IF EXISTS "+viewEmps);  
  7.   onCreate(db);  
  8.  }  
加入資料
  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.    cv.put(colDeptID, 2);  
  7.    cv.put(colDeptName, "IT");  
  8.    db.insert(deptTable, colDeptID, cv);  
  9.                      db.close();  

更新資料
  1. publicint 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. publicvoid 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.    return cur;  
  7.   }  

取得部門內僱員資訊
  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. publicint 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.   }  

相關推薦

SQLite3 觸發器檢視案例

介紹: 安卓預設的資料是SQLite,但SQLite3.6.19之前是不支援外來鍵的,如果有兩張表需要關聯,用外來鍵是最省事的,但不支援的話怎麼辦呢?這裡就有一個解決辦法,就是用事務將兩張表關聯起來,並且最後生成一張檢視。 現有兩張表 EmployeesDept檢視 V

修改MySQL儲存過程函式事件觸發器檢視的DEFINER

#修改儲存過程、函式、事件、觸發器、檢視的 DEFINER select definer from mysql.proc; update mysql.proc set definer='[email protected]%'; select DEFINER fro

修改MySql的儲存過程函式事件觸發器檢視的 DEFINER

#修改儲存過程、函式、事件、觸發器、檢視的 DEFINER select definer from mysql.proc; update mysql.proc set definer='[email protected]'; or update mysql.pro

Mysql觸發器檢視儲存過程詳解(例項)

/*觸發器trigger*/觸發器的概念:監視某種情況並出發某種操作例如:一個電子商城商品表goods簡稱g:主鍵   商品名    庫存    1      電腦      282      手錶      120訂單表o:訂單主鍵    訂單外來鍵    購買數量1   

sql server 2000/2005/2008 判斷儲存過程觸發器檢視是否存在並刪除

--判斷是否存在addOneArticle這個儲存過程 if Exists(select name from sysobjects where NAME = 'addOneArticle' and type='P')     drop procedure addOneArticle --判斷是否存在coun

五十七檢視模板配合使用,缺一不可MVT綜合案例

一、檢視函式的使用 注意:檢視函式必須有一個引數request,進行處理之後,需要返回一個HttpResponse的類物件, hello python就是返回給瀏覽器顯示的內容。 1、在專案的views.py 檔案中寫入函式 2、進行url配置:建立url地址和檢視的對應關

MySQL中索引檢視觸發器詳解

一、索引 1.概述   所有 MySQL 列型別都可以被索引,對相關列使用索引是提高 SELECT 操作效能的最佳途 徑。根據儲存引擎可以定義每個表的最大索引數和最大索引長度,每種儲存引擎(如 MyISAM、 InnoDB、BDB、MEMORY 等)對每個表至少支援 16 個索引

mysql查詢指定庫的所有表的記錄數外來鍵索引檢視觸發器

--  查詢指定庫的所有表資料行數 use information_schema; select table_name,table_rows from tables  where TABLE_SCHEMA = 'cs_lanzhou'  order by table

SQL Server觸發器建立刪除修改檢視

教程貼士:本教程為大家介紹SQL Server觸發器建立、刪除、修改、檢視方法。     一:觸發器是一種特殊的儲存過程,它不能被顯式地呼叫,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性約束。   二:SQL Server

檢視觸發器事務儲存過程函式,流程控制

檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即可,

mysql-檢視觸發器事務儲存過程函式

目錄 檢視 觸發器 事務 儲存過程 流程控制 一、檢視 檢視是由查詢結果構成的一張虛擬表,和真實的表一樣,帶有名稱的列和行資料 強調:檢視是永久儲存的,但是檢視儲存的不是資料,只是一條sql語句 檢視的特點: 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係。 

MySQL:檢視觸發器儲存過程事務

檢視: 檢視,虛擬表 建立虛擬表: # 語法: # create view 虛擬表名稱 as 虛擬表; create view course_and_teacher as select * from course inner join teacher on course.teacher_id =

SQL的綜合案例觸發器函式遊標儲存過程)

下面是一個學生資訊的建立 在這裡就不建立資料庫了 CREATE TABLE CLASS ( class_id int IDENTITY PRIMARY KEY, --班級ID class_name Varchar(50), --班級名稱 cla

sql server 查看錶檢視觸發器儲存過程等組成sql查詢語句

1. 檢視使用者表 select name from sys.tables select name from sys.objects where type='U' select name from sysobjects where xtype='U'   其中type

【轉】MySQL資料庫 外來鍵檢視儲存過程觸發器的優缺點

https://www.yiibai.com/mysql/introduction-sql-views.html 檢視 使用資料庫檢視的優點 資料庫檢視允許簡化複雜查詢:資料庫檢視由與許多基礎表相關聯的SQL語句定義。 您可以使用資料庫檢視來隱藏終端使用者和外部應用

檢視儲存過程函式觸發器事件

儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。函式l過程不必返回值l函式必須返回值l過程可

MySQL之檢視觸發器事務儲存過程

http://www.cnblogs.com/linhaifeng/articles/7495918.html 檢視 ​ 試圖就是一個虛擬表(非真實存在),本質就是【根據sql語句獲取動態的資料集,併為其命名】,使用者使用時只需要使用名稱即可獲取資料集,可將該資料集當作表來使用。 ''' what: 檢

SQLServer觸發器建立刪除修改檢視示例程式碼

一: 觸發器是一種特殊的儲存過程﹐它不能被顯式地呼叫﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性約束。 二: SQL Server為每個觸發器都建立了兩個專用表:Inserted表和Deleted表。這兩個表。一:

第六篇:檢視觸發器事務儲存過程函式

一 檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即

在Oracle資料庫中查詢所有觸發器儲存過程檢視

在Oracle資料庫中查詢所有觸發器、儲存過程、檢視、表 方法一: Select object_name From user_objects Where object_type='TRIGGER';  --所有觸發器 Select object_name From user_objects Where ob