Ch 18 SQLite資料庫應用.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

第 7 章 数据库 1. Overview  数据库概述  数据库管理系统  数据库的体系结构和数据库模型  SQL 语言  数据库技术  构建数据库系统 2.
第一單元 建立java 程式.
Select 指令 基本結構 WHERE Like語法 Order by與group by Having 與 AS
指導教授 ~ 張志勇 組員: 彭勇盛 陳信通 吳建賦
計算機程式語言實習課.
第5章 关系数据库标准语言SQL 主讲:张丽芳.
十一 ASP对数据库的访问.
第2讲 Transact-SQL语言.
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
计算机应用基础 上海大学计算中心.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
Views ,Stored Procedures, User-defined Function, Triggers
SQL Structured Query Language 用以操縱資料庫的指令集 資料操作語言DML:操作資料錄
第六章 學習SQL語言.
第四組 停車場搜尋系統 第四組 溫允中 陳欣暉 蕭積遠 李雅俐.
LINQ 建國科技大學 資管系 饒瑞佶.
課程名稱:資料庫系統 授課老師:李春雄 博士
9/28號專題報告 Web網頁遊戲 曾建瑋.
連結資料庫 ACCESS MSSQL.
Q101 在701 SDX Linux上的標準安裝與使用程序v2
JDK 安裝教學 (for Win7) Soochow University
Chap 10 SQL定義、操作與控制指令.
高等資料庫管理系統 Advanced Database Management System
第八章 利用SELECT查詢資料.
資料庫管理 操作DBMS 指導教授:楊維邦  助教:廖皓翔.
資料庫安全 (Database Security)
SQL語法 定義與操作指令.
ContentProvider與資料共享
ANDROID PROGRAMMING2.
SQL Stored Procedure SQL 預存程序.
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
R教學 安裝RStudio 羅琪老師.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
Ch12 MySQL資料庫管理 網頁程式設計.
連結資料庫管理系統.
App Inventor2呼叫PHP存取MySQL
資料庫程式設計 VB資料庫設計簡介 週次:6 建國科技大學 資管系 饒瑞佶.
Java 程式設計 講師:FrankLin.
網頁切換移轉 JS vs. ASP.NET.
Chap3 Linked List 鏈結串列.
第一單元 建立java 程式.
資料庫概論 許明宗.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
Pocket Access.
VB2005 DataBase Manipulation Command for Access
第 19 章 XML記憶體執行模式.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
PHP與MySQL 入門學習指南 凱文瑞克 著 第 22 章 SQL 介紹與建立MySQL資料庫.
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
SQL查询语句 蔡海洋.
挑戰C++程式語言 ──第8章 進一步談字元與字串
第三章 SQL Server数据管理.
GridView.
GridView操作 (II).
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
陣列與結構.
SQL語法教學 2015/10/15 John.
第 4 章 認識 SQL 語言與資料型別.
資料表示方法 資料儲存單位.
連結資料庫 MYSQL.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
第4章 数据查询.
SQLite資料庫 靜宜大學資管系 楊子青.
Chapter 4 Multi-Threads (多執行緒).
Unix指令4-文字編輯與程式撰寫.
Develop and Build Drives by Visual C++ IDE
InputStreamReader Console Scanner
Presentation transcript:

Ch 18 SQLite資料庫應用

Android以SQLite資料庫引擎管理資料庫,並提供有sqlite3命令列工具與資料庫相關的API。SQLite與一般資料庫引擎一樣屬於關連性資料庫管理系統 (Relational DataBase Management System,RDBMS)的一種,但它將一些非絕對必要的功能取消,同時是執行於本機的資料庫引擎,不需要透過伺服器提供服務。

一、關連性資料庫與SQLite 關連性資料庫以資料表提供有效及結構化的資料保存與管理,一個資料庫可以擁有多個資料表。資料表由列與欄組成,每一列為一筆單獨的記錄,含有不同的資料欄內容,而一個資料欄是所有記錄共同類型的資料。 SQLite並非出自Google,而是由一個SQLite聯盟持續的開發和維護,它可以使用大部份標準SQL語言。

SQLite屬於嵌入式的SQL資料庫引擎,不需依賴伺服器而能自己工作,它所有的資料表都包含在同一個資料庫檔案中,且此資料庫檔案為跨平台的格式。 SQLite的函式庫相當小,它能在很小的堆疊(約4KB)與堆積(約100KB)空間中執行,加上它的可靠行相當高,這使得它非常適合在類似行動裝置這類資源有限的設備上使用。 SQLite對於資料庫管理採取交易的模式,它交易的方式是所有動作完全成功,或是任何動作都不作用,因此就算應用程式在執行中被意外中止,對於處理中的資料庫也不會造成損害,這更提升了資料的正確與安全。

經由SQLite的協助,資料庫就如同一般的檔案一樣,可以存在行動裝置的內建記憶體,或外加的擴充SD卡上,但一般都存於行動裝置內建記憶體的「/data/data/<專案套件>/databases」目錄中,此目錄由專案自動建立。

1、SQL語法 所有SQL的指令大致可以分成2類: 資料定義語言(Data Definition Language,DDL),這類的指令主要是用於建立資料表與資料欄。 資料操作語言(Data Manipulation Language,DML),這類的指令則用於資料表內的資料,包括新增(insert)、更新(update)、刪除(delete)、查詢(query)等。

資料定義語言(DDL): CREATE TABLE DROP TABLE 在資料庫中建立新的資料表。建立時需提供資料表名稱,與此資料表所含的資料欄與資料欄的資料型式。 以CREATE TABLE建立的資料表與資料欄定義稱為資料庫的概要圖。 DROP TABLE 移除用CREATE TABLE建立的資料表。 執行此指令時需要提供要移除的資料表名稱,移除的資料表會從資料庫概要圖及儲存位置移除,移除後不能再恢復,所含的資料也一併刪除。

資料操作語言(DML): ALTER TABLE 資料表中設定的約束 SELECT 改變資料表的結構,但不能更改已經存在的資料欄名稱或移除資料欄,也不能從資料表中移除約束。 資料表中設定的約束 約束是一種資料欄的屬性,可以用來限制這資料欄所能存在的內容。 資料操作語言(DML): SELECT 資料查詢的主要工具,執行的結果會傳回0筆或多筆記錄,並可指定傳回記錄所包含的資料欄。 SELECT指令中可以含有以下的子句: FROM子句:指定對那一個資料表執行查詢,可以指定回傳記錄所包括的資料欄;如果要包含原資料表所有資料欄,則以「*」表示資料欄名稱。

WHERE子句:指定查詢的條件,只有滿足指定條件的記錄才會回傳,也可以指定回傳記錄所包括的資料欄。在WHERE子句中可以使用「LIKE」及萬用字「%」作為篩選條件。 ORDER BY子句:將查詢回傳的記錄以指定的資料欄為標準排序。排序方式可以設定為「ASC」,表示以升冪方式排序,或「DESC」表示以降冪方式排序。 GROUP BY子句:查詢回傳的記錄以指定的資料欄進行分組統計。 HAVING子句:將分組統計過的查詢結果,再進行篩選。與WHERE的差別是,WHERE篩選條件發生在分組統計之前;而HAVING子句的篩選,發生在分組統計之後。 LIMIT子句:用以設定查詢回傳記錄筆數的上限,可以使用任何產生正整數的表示式來限定回傳記錄筆數。

交易(Transaction) INSERT UPDATE DELETE 用以修改滿足指定條件記錄的指定資料欄內容,執行時需提供資料表與要更新的資料欄名稱,以及新的資料欄內容。 DELETE 從資料表中移除滿足指定條件的記錄,執行時需提供資料表名稱與篩選的WHERE條件子句。 交易(Transaction) 資料庫的交易是由一系列的SQL指令構成,且交易的結果為所有指令都完成,或沒有一個指令對資料庫產生作用。

對於SQLite資料庫引擎,每一個影響資料庫的操作是在自己的交易上自動進行,這表示程式開發者可以確認在SQL指令成功執行後,它對資料庫的影響立即生效,這些自動開始的交易會在完成最後一個SQL指令後交付給SQLite資料庫引擎。 也可以用「BEGIN」明確的開始一個交易,這交易會在下一個「COMMIT」命令才交付出去執行,且SQLite資料庫引擎將在確認交易中所有指令都順利完成後,才會真正修改資料庫的內容。

二、sqlite3命令列工具 對於SQLite資料庫相關的開發過程,經常會先以「sqlite3」命令列工具,檢查資料庫應用程式執行結果或除錯。 使用sqlite3需透過「adb shell」,而且必須先啟動模擬器,步驟如下: 啟動模擬器 建立資料庫存放的資料夾 adb shell # cd /data/data/

建立資料庫存放的資料夾 adb shell # cd /data/data/ #mkdir com.example.sqlite3test (在「/data/data/」目錄下建立新的「com.example.sqlite3test」目錄) #cd com.example.sqlite3test #mkdir databases (在「/data/data/com.example.sqlite3test」目錄下建立新的「databases」目錄)

建立資料庫並進入sqlite3命令列 #sqlite3 company.db sqlite3接受2種指令,資料庫操作的SQL指令,或sqlite3本身的以「.」開始的單字指令。 SQL指令必須以「;」為指令結束,未鍵入「;」前,sqlite3會視為是同一個指令,以「…>」提示符號提醒指令尚未完成(也就是說SQL指令可以分成多行鍵入) 單字指令不必以「;」結束,常用的有「.help」列出sqlite3所有單字命令說明,與「.exit」離開sqlite3(按「Ctrl+C」鍵也可以離開sqlite3)。

建立資料表 sqlite>CREATE TABLE employee ( …>_id integer primary key,name text UNIQUE NOT NULL …>,age INTEGER, salary INTEGER); sqlite>

在目前資料庫中建立「employee」資料表,此資料表有4個資料欄, 「_id」資料欄資料型式為整數,且為此資料表的主鍵欄(主鍵可用與和其它資料表關連),Android用這個特殊_id名稱是為了要讓資料表能工作於它的游標(Cursor)系統 「name」資料欄資料型式為字串,且設定它的資料不能重覆,也不能是NULL 「age」資料欄資料型式為整數 「salary」資料欄資料型式也是整數。 注意對於SQL指令是不區分大小寫,因此「INTEGER」與「integer」意義相同。

新增記錄 sqlite>INSERT INTO employee(_id,name,age,salary) VALUES(1,”Smith”,28,40000); VALUES(2,”John”,32,38000); VALUES(3,”Helen”,27,35000); VALUES(4,”Joe”,41,42000); 用「INSERT」指令在employee資料表新增4筆記錄;並設定各資料欄內容,注意字串要使用雙引號「”」。

查詢記錄 sqlite>SELECT * FROM employee; 查詢employee資料表所有的記錄,並取得所有資料欄;注意,sqlite3以「|」分隔各資料欄。 sqlite>SELECT name,age,salary FROM employee WHERE salary >= 38000 ORDER BY salary; 查詢employee資料表中「salary」資料欄內容大於(含)38000的所有記錄,只取資料表中「name」、「age」、「salary」3個資料欄,並以「salary」資料欄排序。

更新記錄 刪除記錄 sqlite>UPDATE employee SET salary=41000 WHERE name=”Smith”; sqlite>SELECT * FROM employee; 將姓名為”Smith”的記錄的「salary」資料更新為「41000」,然後查詢employee資料表中所有記錄。 刪除記錄 sqlite>DELETE FROM employee WHERE salary=35000; sqlite>SELECT * FROM employee ORDER BY salary DESC; 將資料表中「salary」資料欄為35000的記錄刪除,然後查詢employee資料表中所有記錄,並以「salary」資料欄降冪排序。

三、資料庫應用相關類別 SQLiteOpenHelper 負責建立資料庫與管理版本的輔助類別,在應用程式中必須建立它的延伸類別,並於應用資料庫之前以此延伸類別取得對指定資料庫的參考。 如果指定的資料庫不存在,此延伸類別會自動建立此資料庫與事先設計的資料表。 建構函式定義如下: public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

onCreate(SQLiteDatabase)方法在資料庫第一次建立時呼叫,這是建立資料表與初始化資料表的地方。 onUpgrade(SQLiteDatabase, int, int)方法是當資料庫概要圖需要更改時呼叫,要增加或刪除資料表都應在此方法內實作。 onOpen(SQLiteDatabase)方法在資料庫開啟後呼叫,一般是在這個方法內檢查資料庫是否是唯讀的,避免更新資料表時產生意外。

其他常用的方法: getReadableDatabase():建立或開啟唯讀資料庫。 getWritableDatabase():建立或開啟可以讀寫的資料庫。 getDatabaseName():取得已開啟資料庫名稱。 close():關閉資料庫。

SQLiteDatabase SQLiteDatabase的實體物件參考到開啟的資料庫,提供了建立、新增、更新、刪除、執行SQL命令,以及其他常用的資料庫管理方法。 常用的方法有: beginTransaction():以EXCLUSIVE模式開始一個交易的範圍定義。 beginTransactionNonExclusive():以IMMEDIATE模式開始一個交易範圍定義。 endTransaction():結束交易範圍定義。 create ():建立一個記憶體備份的資料庫,此資料庫在關閉時自動刪除。

openDatabase()或openOrCreateDatabase():開啟資料庫。 insert():在指定資料表中新增一筆記錄。 query():依設定的條件查詢資料表,執行結果會回傳包含查詢結果的Cursor物件。 replace():在指定資料表中以新值取代或新增一筆記錄。 update():更新資料表中滿足指定條件的記錄,可以一次更新多筆記錄。 delete():刪除資料表中符合指定條件的記錄,可以一次刪除多筆記錄。 execSQL():執行一個不會回傳資料的SQL指令。 deleteDatabase():刪除指定的資料庫。

Cursor Cursor是存放資料查詢回傳結果的容器,透過Cursor可以指定要從回傳結果中讀取那一筆記錄。 常用的方法有: close():關閉Cursor物件並釋放其所有資源,執行後此物件無法再使用。 getBlob(int columnIndex):以位元組陣列回傳指定資料欄的內容,資料欄索引從0開始。 getFloat(int columnIndex):以浮點數回傳指定資料欄的內容。 getInt(int columnIndex):以整數回傳指定資料欄的內容。 getString(int columnIndex):以字串回傳指定資料欄的內容。

getType(int columnIndex):傳回指定資料欄的資料型式。 getColumnCount():回傳查詢結果含有幾個欄位。 getCount():回傳查詢結果含有幾筆記錄。 getPosition():回傳游標目前在查詢結果的位置(第幾筆記錄)。 isAfterLast():回傳目前游標是否位於查詢結果最後一筆記錄之後。 isBeforeFirst():回傳目前游標是否位於查詢結果第一筆記錄之前。 isFirst():回傳目前游標是否位於查詢結果的第一筆記錄。 isLast():回傳目前游標是否位於查詢結果的最後一筆記錄。

isNull (int columnIndex):回傳指定資料欄的內容是否為NULL。 move(int offset):從目前位置將游標往後(正值)或往前(負值)移動指定的記錄筆數。 moveToFirst():將游標移到第一筆記錄。 moveToLast():將游標移到最後一筆記錄。 moveToNext():將游標移到下一筆記錄。 moveToPrevious():將游標移到前一筆記錄。 moveToPosition(int position):將游標移到指定位置的記錄。

ContentValues 此類別的作用是用來儲存一組鍵/值對,常用的方法有: put(String key, dataType value):將鍵/值對存至ContentValues物件。 clear():清除ContentValues物件內部所有儲存的值。

四、資料庫應用範例 DatabaseApp2 Test範例 範例將建立「people.db」資料庫與「employee」資料表,資料表每一筆記錄有「_id」、「name」、「age」、「salary」4個資料欄,其中「_id」為主鍵欄,與「age」、「salary」資料欄的資料型式都是整數;而「name」資料欄資料型式為字串,且設定有資料不能重覆及不能是null的約束。 活動佈局中以EditText元件顯示記錄中「_id」以外的內容,並有3個主要功能按鈕。

範例也自建一個延伸自SQLiteOpenHelper類別的子類別「DatabaseHelper.java」。 「全部」鈕取得資料表內所有記錄,並可透過「下一筆」、「前一筆」鈕逐筆顯示記錄。 「刪除」鈕刪除目前顯示的記錄。 「新增」鈕在各EditText元件中輸入資料後,按「確認」鈕將輸入的資料新增為資料表的一筆記錄。 範例也自建一個延伸自SQLiteOpenHelper類別的子類別「DatabaseHelper.java」。 範例詳細內容請參考原書 code 18-2/3。