計劃名稱 : 104 年度教育部資通訊軟體創新人才推升推廣計畫跨校資源中心 : 雲端運算 ( 國立中山大學 ) 課程名稱 : 網路及平台服務 Part1- 課程教材 教材名稱 :Android 程式設計 -SQLite 國立高雄大學資訊工程學系張保榮教授
大綱 SQLite execsql() 函式 rawquery() 函式 insert() 函式 delet() 函式 update() 函式 query() 函式 close() 函式
SQLite Android 系統使用 SQLite 資料庫系統, 提供 QLiteDatabase 類別來處理資料庫的建立 修改 刪除 查詢等操作方式 而 SQLite 是一個嵌入式的資料庫, 適合 SQL 語法 假若資料的數量是固定的, 則適合使用 SQLite 來建立資料庫 建立 SQLite 資料庫的語法如下 : SQLiteDatabase 物件 = openorcreatedatabase( 檔名, 權限,null);
SQLiteDatabase 類別 SQLiteDatabase 類別提供的方法 : 方法 execsql() rawquery insert() delet() update() query() close() 定義 執行 SQL 命令, 可完成資料表的建立 新增 修改 刪除等動作 以 Cursor 型別回傳資料, 常用於查詢所有資料 資料新增, 以 ContentValues 類別將資料打包再新增到資料表中 刪除指定的資料 資料修改, 以 ContentValues 類別將資料打包再更新資料表內容 以 Cursor 類別傳回指定的欄位資料 關閉資料庫
execsql() 方法 execsql() 方法執行 SQL 命令 SQLiteDatabase 類別提供 execsql() 來執行非 SELECT 及不需要回傳值得 SQL 命令 建立資料表 例如 : 建立資料庫 table01, 內含的欄位為 id num data, 而 id 為自動編碼的主索引欄位, 其他為整數和文字欄位 程式碼如下 : String str = CREATE TABLE table01(id INTEGERPRIMARY KEY,num INTERGER, data TEXT); db.execsql(str);
execsql() 方法 ( 續 ) 新增 String str = INSERT INTO table01 (num,data) values (1, 資料科目 ) ; db.execsql(str); 修改 String str = UPDATE table01 SET num=12,data= 資料更新 WHERE id=1 ; db.execsql(str); 刪除 String str = DELET FROM table01 WHERE id=1 ; db.execsql(str); 移除 String str = DROP TABLE table01 ; db.execsql(str); 關閉 db.close();
execsql() 方法 ( 續 ) 基本畫面
execsql() 方法 ( 續 ) [src] MainActivity.java 完整程式碼如下 先匯入類別元件
execsql() 方法 ( 續 )
execsql() 方法 ( 續 ) 實現 Button 的功能
execsql() 方法 ( 續 )
execsql() 方法 ( 續 ) 模擬器測試結果
rawquery() 方法 rawquery() 和 execsql() 一樣, 都可以執行 SQL 指令, 只是 rawquery() 用於查詢結果或資料 查詢資料表 例如 : 查詢資料表 table01 的所有資料, 並以 Cursor 類型回傳查詢的資料 程式碼如下 : Cursor data = db.rawquery( SELECT * FROM table01,null); 也可以查詢單一欄位的資料, 例如 :id=1 的資料內容 Cursor data = db.rawquery( SELECT * FROM table01 WHERE id=1,null);
rawquery() 方法 ( 續 ) Cursor 類別常用的方法 : 方法 定義 move 以目前位置為參考, 將 Cursor 移動到指定位置 movetoposition 將 Cursor 移到指定的位置, 並回傳 true/false 表示成功或失敗 movetofirst 將 Cursor 移到第一筆, 並回傳 true/false 表示成功或失敗 movetoprevious 將 Cursor 移到上一筆, 並回傳 true/false 表示成功或失敗 movetonext 將 Cursor 移到下一筆, 並回傳 true/false 表示成功或失敗 movetolast 將 Cursor 移到最後一筆, 並回傳 true/false 表示成功或失敗 isbeforefist 回傳 Cursor 是否在第一筆資料之前 isafterlast 回傳 Cursor 是否在最後一筆資料之後 isclosed 回傳 Cursor 是否是否關閉 isfirst 傳回是否是第一筆資料 isnull 傳回指定的資料是否為 null getcount 傳回共有多少筆資料 getposition 取得目前資料所在位置的索引 getint 取得指定索引的 Integer 型別資料 getstring 取得指定索引的 String 型別資料
query() Query() 將 SQL 語法的結構拆解為參數, 包括了要查詢的資料表名稱 要選取的欄位 ;WHERE 篩選條件, 篩選條件參數名 篩選條件參數值 ;GROUP BY 條件 ;HAVING 條件 除了資料表名稱以外, 其餘參數都可使用 null 來取代 語法如下 : Cursor data = query(string table, String[] columns, String selection, String[] selectionarg, String groudby,string having,string orderby, String limit);
query()( 續 ) data: 傳回指定的欄位資料 table: 資料表名稱 columns: 資料表欄位名稱, 設定 null 代表取得所有欄位 selection: 指定查詢的條件, 不必加 WHERE 子句, 設定 null 代表取 得所有欄位 selectionarg: 定義 SQL WHERE 子句中的? 查詢參數 groudby: 設定群組, 不必加 GROUP BY 子句, 設定 null 代表不指定 having: 設定群組, 不必加 HAVING 子句, 設定 null 代表不指定 orderby: 設定群組, 不必加 ORDER BY 子句, 設定 null 代表不指定 limit: 取得資料筆數, 不必加 LIMIT 子句, 設定 null 代表不指定
query()( 續 ) 例如 : 查詢 table01 中所有的資料 db.query( table01,new String[] { num, data }, null, null, null, null,null, null); 例如 : 查詢 table01 中 id=1 的資料 db.query( table01,new String[] { num, data }, id=1, null, null, null,null, null);
insert() 使用 CententValues 類別將資料先以打包的方式, 再以 put() 方法加入資料 語法如下 : CententValues data = new ContentValues(); data.put( name, 郵票 ); data.put( price,15); db.insert( table01,null,data); 方法等同於 SQL 的指令 String str = INSERT INTO table01 (num,data) values (1, 資料科目 ) ; db.execsql(str);
delete() 例如 : 刪除資料表中 id=1 的資料, 語法如下 : int id=1; db.delete( table01, id= +id,null); 方法等同於 SQL 的指令 String str = DELET FROM table01 WHERE id=1 ; db.execsql(str);
update() 使用 CententValues 類別將資料先以打包的方式, 用 put() 方法加入資料, 再透過 update() 更新資料表 CententValues data = new ContentValues(); data.put( name, 郵票 ); data.put( price,15); db.update( table01,id=1,data); 等同於 SQL 的指令 String str = UPDATE table01 SET num=12,data= 資料更新 WHERE id=1 ; db.execsql(str);
SimpleCursorAdapter 類別 rawquery() 或 query() 的查詢資料是以 Cursor 的類別來呈現, 只回傳程式中目前需要用到的資料, 可以節省記憶體資源 假如今天要將資料表的資料顯示在 ListView 上, 則必須使用到 SimpleCursorAdapter 類別當作資料的配接器 ( 暫存 ) SimpleCursorAdapter 語法如下 : SimpleCursorAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flags); context: 表示目前的主程式 layout: 表示顯示的版面配置檔 cursor: 表示要顯示的資料 from: 表示要顯示的欄位 to: 表示版面配置中對應顯示的元件 flags: 建議 flags 值使用 0 可得較佳的匹配 (4.X 版之後才有設定 flags 值 )
SimpleCursorAdapter 類別 ( 續 ) 語法如下 : Cursor cursor = db.rawquery( SELECT * FROM table01,null); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, cursor,new String[] { num, data },new int[] {android.r.id.text1,android.r.id.text2},0); listview01.setadapter(adapter);
SimpleCursorAdapter 類別 ( 續 ) [src] MainActivity.java 完整程式碼如下 先匯入類別元件
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 )
SimpleCursorAdapter 類別 ( 續 ) 模擬器測試結果
自訂類別的方法 方法 定義 MyDB() 傳入建立物件的 Activity open() 開啟以存在的資料庫 ( 表 ), 若不存在則新建一個資料庫 ( 表 ) close() 關閉資料庫 getall() 查詢所有資料 ( 只取出 id name price 等三個欄位 ) get() append() update() delete() 查詢所指定的資料 新增一筆資料 更新指定的資料 刪除指定的資料
Create MyDB [src] MainActivity.java 完整程式碼如下 先匯入類別元件
Create MyDB ( 續 )
Create MyDB ( 續 )
Create MyDB ( 續 )
Create MyDB ( 續 ) 實現 Button 功能 使用錯誤捕捉的功能
Create MyDB ( 續 )
Create MyDB ( 續 ) [src] 新增 MyDB.java, 並寫入下列的完整程式碼 如下 :
Create MyDB ( 續 )
Create MyDB ( 續 )
Create MyDB ( 續 ) 模擬器測試結果 新增一筆資料, 名稱 :Banana, 價格 :30 其餘的功能同學自行測試
END