第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite

Slides:



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

作業一 : USING DBMS ( 使用 DB2 及 SQL 基本練習 ) 報告人:學生楊群期 學號: 課程 : 高等資料庫 講師 : 楊維邦教授.
JSP 与数据库 SQL 语言简介 SQL 语言简介 JDBC 简介 JDBC 简介 使用 JDBC 连接数据库 使用 JDBC 连接数据库 访问数据库 数据库访问应用举例.
第十章 Java 数据库编程. 内容提要 数据库有关概念; 介绍 JDBC 的结构; 重点介绍 JDBC 访问几种数据库的基本过程;
2010 年 6 月课件制作人:王亚楠 1 模块 2 项目开发概论 教学课件 年 6 月课件制作人:王亚楠 2 目录 目标 了解:数据库技术的基本概念与结构 理解:数据模型的分类与结构组成 掌握:关系数据库及 SQL 的基本理论 知识 掌握:数据库设计的方法与步骤 内容 2.1 数据库技术基础.
Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
Java 技术与应用 数据库应用 ( 第 14 章 ) 西安交大 卫颜俊 2008 年 12 月 电子信箱: QQ: 网站 : /java.
第 7 章 数据库 1. Overview  数据库概述  数据库管理系统  数据库的体系结构和数据库模型  SQL 语言  数据库技术  构建数据库系统 2.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
数据存储.
第2章 資料庫系統 2-1 資料庫環境的四大組成元件 2-2 ANSI/SPARC的三層資料庫系統架構
十一 ASP对数据库的访问.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
第2讲 Transact-SQL语言.
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
第 八 章 資料庫安全 本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之80%)以製作為輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著作物移作他用。
文科计算机小公共课规划教材 Access 程序设计.
计算机应用基础 上海大学计算中心.
資料庫管理 資管二 賴柏融.
第二章 JAVA语言基础.
第7章 建立資料表與完整性限制條件 7-1 資料型別 7-2 資料表的建立 7-3 建立完整性限制條件 7-4 修改與刪除資料表
创意源自激情,技术成就梦想 畅翼创新俱乐部 2012年春俱乐部第三次技术培训 赵程.
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Access 2007 進銷存管理系統實作 文魁資訊股份有限公司.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第六章 學習SQL語言.
第 8 章 資料的 新增、修改與刪除.
課程名稱:資料庫系統 授課老師:李春雄 博士
Chapter 12 T-SQL 語法與 ASP.NET.
二.資料庫系統建立與管理 Access 資料庫:windows下的單機資料庫 Access 操作 Mysql資料庫介紹.
Chap 10 SQL定義、操作與控制指令.
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
資料庫安全 (Database Security)
第8章 Android内容提供者(ContentProvider)应用
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
Transact-SQL 語言設計教學.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
SQL Server 2000 数据库入门.
ContentProvider與資料共享
ANDROID PROGRAMMING2.
程式設計實作.
抽象类 File类 String类 StringBuffer类
課程名稱:資料庫系統 授課老師:李春雄 博士
課程名稱:資料庫系統 授課老師:李春雄 博士
第3章 MySQL教學範本 主從式資料庫系統 - CH3.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
实验4:PL-SQL编程 1.实验目的 2.实验原理 PL/SQL是一种过程化语言,属于第三代语言,本实验在与熟悉使用PL/SQL编程.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
資料庫管理(Access 2003) 第五章 利用查詢來 統計與分析資料 許欽嘉 老師.
MySQL开发规范 DB组-张浩.
實驗十一:待辦事項程式 (儲存在手機上).
資料庫概論 許明宗.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
第一章 数 据 库 概 述 第一节 引言 第二节 数据库基本概念 第三节 数据库系统结构 第四节 数据模型 第五节 数据库管理系统
CS, ZJU 4/18/2019 Chapter 7 数据库.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
Ch17 SharedPreference與檔案應用
6 SQL語言與資料庫建置 6-1 SQL語言的基礎 6-2 SQL Server的資料庫結構 6-3 建立使用者資料庫
SQL查询语句 蔡海洋.
第三章 SQL Server数据管理.
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第2章 Java语言基础.
資料庫應用與實作 一到六章重點、習題.
第4章 数据查询.
SQLite資料庫 靜宜大學資管系 楊子青.
Presentation transcript:

第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite 10-5 Storage Access Framework

10-1 存取偏好設定 10-1-1 存取活動的偏好設定 10-1-2 存取應用程式的偏好設定

10-1-1 存取活動的偏好設定 – 說明 在Android提供SharedPreferences物件儲存應用程式資料,主要是指一些偏好設定的字型尺寸、使用者帳號、色彩或遊戲分數,實際上,就是使用XML格式的偏好設定檔來儲存這些資料。 SharedPreferences類別屬於android.content套件,可以儲存少量且簡單的應用程式資料,這些資料是儲存成類似Bundle物件的鍵值與對應值,支援Boolean、Float、Integer、Long和String型態的資料。

10-1-1 存取活動的偏好設定 – 取得SharedPreferences物件 在活動存取偏好設定需要取得SharedPreferences物件,通常我們是在onCreate()覆寫方法取得此物件,如下所示: private SharedPreferences prefs; …. prefs = getPreferences(MODE_PRIVATE); 程式碼使用Activity類別的getPreferences()方法取得SharedPreferences物件,參數是操作模式常數,MODE_PRIVATE只允許建立偏好設定檔的活動存取,只允許同一個活動來存取。

10-1-1 存取活動的偏好設定 – 讀取偏好設定資料 讀取偏好設定建議是在onResume()覆寫方法,在取得SharedPreferences物件prefs後,使用getString()、getFloat()或getInt()等方法取得儲存字串、浮點數和整數等值,如下所示: String amount = prefs.getString(PREF_AMOUNT, "10000"); txtAmount.setText(amount); float rate = prefs.getFloat(PREF_RATE, 28.9F); txtRate.setText(String.valueOf(rate));

10-1-1 存取活動的偏好設定 – 儲存偏好設定資料1 儲存偏好設定建議是在onPause()覆寫方法,我們是使用SharedPreferences.Editor物件來編輯存入的資料,如下所示: SharedPreferences.Editor prefEdit = prefs.edit(); 然後使用putString()、putInt()和putFloat()等方法存入字串、整數和浮點數等資料,如下所示: prefEdit.putString(PREF_AMOUNT, txtAmount.getText().toString()); float rate; rate = (float) Double.parseDouble(txtRate.getText().toString()); prefEdit.putFloat(PREF_RATE, rate);

10-1-1 存取活動的偏好設定 – 儲存偏好設定資料2 最後記得使用apply()或commit()方法將資料寫入偏好設定檔,如下所示: prefEdit.apply(); 上述apply()方法是API 9新增的方法,它會馬上更改記憶體中的資料,然後以非同步方式寫入XML檔案,所以速度比較快且沒有傳回值。

10-1-2 存取應用程式的偏好設定 – 說明 如果偏好設定檔是Android應用程式中各活動之間的分享資料,也就是說在應用程式中的每一個活動都可以存取,屬於應用程式層級(Application-level)的偏好設定。

10-1-2 存取應用程式的偏好設定 – 取得物件 我們需要使用繼承自Context類別的getSharedPreferences()方法來取得SharedPreferences物件,如下所示: private SharedPreferences prefs; … prefs = getSharedPreferences("MyPref", MODE_PRIVATE); 第1個參數是偏好設定檔名稱,第2個參數值MODE_PRIVATE只允許建立偏好設定檔的應用程式存取。在各活動就可以使用SharedPreferences物件prefs來存取偏好設定值。

10-1-3 存取偏好設定頁面的設定值 – 載入偏好設定頁面的預設值 10-1-3 存取偏好設定頁面的設定值 – 載入偏好設定頁面的預設值 一般來說,因為偏好設定頁面不會是應用程式的主活動,所以,在主活動的onCreate()覆寫方法需要載入偏好設定頁面的預設值,如下所示: PreferenceManager.setDefaultValues( this,R.xml.preferences,false); PreferenceManager類別的setDefaultValues()類別方法有3個參數,第1個參數是Context物件,第2個參數是偏好設定頁面的資源索引,最後1個參數值false,表示不重新讀取預設值;true是再重新讀取預設值。

10-1-3 存取偏好設定頁面的設定值 – 取出偏好設定值1 10-1-3 存取偏好設定頁面的設定值 – 取出偏好設定值1 在載入偏好設定頁面的預設值後,因為偏好設定值是使用預設的SharedPreferences物件來存取,我們需要使用PreferenceManager類別的方法來取得此物件,如下所示: SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

10-1-3 存取偏好設定頁面的設定值 – 取出偏好設定值2 10-1-3 存取偏好設定頁面的設定值 – 取出偏好設定值2 接著可以一一取出偏好設定值,方法第1個參數的鍵值是android:key屬性值,如下所示: String username = settings.getString("username", ""); String password = settings.getString("password", ""); boolean isMorePrefs = settings.getBoolean("more_pref", false); String color = settings.getString("color_pref", "");

10-2 檔案存取 10-2-1 存取內部儲存裝置的檔案 10-2-2 讀取原料資源的檔案 10-2-3 存取外部SD卡的檔案

10-2 檔案存取 Android應用程式可以使用java.io套件的類別來寫入與讀取檔案,在Context類別提供openFileInput()和openFileOutput()方法來分別讀取與寫入檔案。Android應用程式可以在3個地方存取檔案資料,如下所示: 內部儲存裝置:在保護目錄儲存空間讀寫檔案資料。 專案的原料資源:在APK套件保護的唯讀空間,即Android專案的原料資源(Raw Resources),唯讀檔案是位在「\res\raw\」目錄。 外部儲存裝置:在外部儲存空間讀寫檔案,例如:SD卡,應用程式需要WRITE_EXTERNAL_STORAGE權限和API層級4以上,如果使用Android 6.0以上版本,我們需要在執行期取得權限才能在SD卡讀寫檔案。

10-2-1 存取內部儲存裝置的檔案– 說明 在Android應用程式如果需要將資料儲存至檔案,第一個選擇就是行動裝置的內部儲存裝置。

10-2-1 存取內部儲存裝置的檔案– 開啟檔案輸出串流 Android程式碼是使用java.io套件FileOutputStream類別將資料寫入檔案,如下所示: FileOutputStream out = openFileOutput( fname,MODE_PRIVATE); 程式碼使用繼承自Context類別的openFileOutput()方法來開啟FileOutputStream檔案輸出串流,第1個參數是檔案名稱字串,第2個參數是檔案操作模式常數,預設值MODE_PRIVATE,即值0 。

10-2-1 存取內部儲存裝置的檔案– 寫入檔案 我們可以使用OutputStreamWriter類別,將字元串流轉換成位元組串流,如下所示: OutputStreamWriter sw = new OutputStreamWriter(out); 然後就可以將資料寫入檔案,如下所示: sw.write(str); 最後呼叫flush()方法輸出串流資料,和close()方法關閉串流,如下所示: sw.flush(); sw.close();

10-2-1 存取內部儲存裝置的檔案– 開啟檔案輸入串流 讀取檔案是使用FileInputStream搭配InputStreamReader物件,如下所示: FileInputStream in = openFileInput(fname); InputStreamReader sr = new InputStreamReader(in); 程式碼使用繼承自Context類別的openFileInput()方法開啟FileInputStream檔案輸入串流,參數是檔案名稱字串,然後使用此物件建立InputStreamReader物件。

10-2-1 存取內部儲存裝置的檔案– 讀取檔案 char[] buffer = new char[READ_BLOCK_SIZE]; 我們需要自行建立讀取緩衝區的char[]陣列,然後使用while迴圈來讀取檔案內容,如下所示: char[] buffer = new char[READ_BLOCK_SIZE]; while ((count = sr.read(buffer)) > 0) { String s = String.copyValueOf(buffer,0, count); str += s; buffer = new char[READ_BLOCK_SIZE]; } 最後使用close()方法關閉串流,如下所示: sr.close();

10-2-2 讀取原料資源的檔案 - 原料資源 原料資源(Raw Resources)是位在Android專案的「\res\raw\」目錄,如圖所示:

10-2-2 讀取原料資源的檔案 – 開啟檔案的讀取串流 10-2-2 讀取原料資源的檔案 – 開啟檔案的讀取串流 在Android程式是使用Resources物件的openRawResource()方法開啟檔案的讀取串流,如下所示: InputStream in = this.getResources(). openRawResource(R.raw.note); InputStreamReader sr = new InputStreamReader(in); 程式碼呼叫openRawResource()方法開啟InputStream串流,參數是檔案的資源索引,然後使用建構子建立InputStreamReader讀取串流。

10-2-2 讀取原料資源的檔案 – 讀取文字檔內容 使用BufferedReader緩衝區串流,如下所示: 10-2-2 讀取原料資源的檔案 – 讀取文字檔內容 使用BufferedReader緩衝區串流,如下所示: BufferedReader br = new BufferedReader(sr); 建構子參數是之前InputStreamReader讀取串流sr,在建立BufferedReader緩衝區串流後,就可以使用串流物件的readLine()方法來一行一行讀取文字檔內容,直到值為null為止,如下所示: String s = null, str = ""; while ((s = br.readLine()) != null) str += s + "\n";

10-2-2 讀取原料資源的檔案 – 關閉串流 最後一樣需要使用close()方法來關閉串流,如下所示: br.close(); 10-2-2 讀取原料資源的檔案 – 關閉串流 最後一樣需要使用close()方法來關閉串流,如下所示: br.close(); sr.close();

10-2-3 存取外部SD卡的檔案– 說明 除了將檔案儲存至內部儲存裝置外,對於大量資料或需要分享給其他使用者的資料,我們可以將檔案儲存在外部儲存裝置,最常使用的是SD卡。 Android Studio專案Ch10_2_3和第10-2-1節相同,只是將存取檔案儲存在外部儲存裝置的SD卡,請注意!Android 6.0之上版本,在第1次執行時需取得使用者授權才能存取SD卡,如下圖所示:

10-2-3 存取外部SD卡的檔案– 檢查是否有外部儲存裝置 if (!Environment.getExternalStorageState(). equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(this, "沒有外部儲存裝置...", Toast.LENGTH_SHORT).show(); finish(); return; }

10-2-3 存取外部SD卡的檔案– 在SD卡建立目錄和存取檔案內容 在確認有掛載SD卡後,就可以在外部儲存裝置建立目錄和檔案,try/catch例外處理如下所示: try { File sd = Environment.getExternalStorageDirectory(); File dir = new File(sd.getAbsolutePath() + fpath); if (!dir.exists()) dir.mkdir(); file = new File(dir, fname); } catch (Exception ex) { ex.printStackTrace();

10-2-3 存取外部SD卡的檔案– 在SD卡建立目錄和存取檔案內容 在建立目錄後,就可以在此目錄下建立檔名為fname字串的檔案,即File物件file,這是我們準備寫入和讀取資料的檔案。接著使用File物件file來建立FileOutputStream和FileInputStream物件,以便寫入和讀取檔案內容,如下所示: FileOutputStream out = new FileOutputStream(file); FileInputStream in = new FileInputStream(file);

10-3 關聯式資料庫與SQLite 10-3-1 認識關聯式資料庫 10-3-2 SQLite資料庫引擎 10-3-3 SQL語言的基礎

10-3 關聯式資料庫與SQLite 資料庫(Database)是一種資料儲存單位,一些經過組織的資料集合,眾多出勤管理系統、倉庫管理系統、進銷存系統或小至錄影帶店管理系統,這些應用程式都屬於不同應用的資料庫系統。 資料庫系統是由資料庫和資料庫管理系統所組成,資料庫管理系統是一套管理資料庫的應用程式。

10-3-1 認識關聯式資料庫 – 說明 關聯式資料庫系統(Relational Database System)是目前資料庫系統的主流,巿面上大部分資料庫管理系統都屬於關聯式資料庫管理系統(Relational Database Management System),例如:Access、MySQL、SQL Server和Oracle等。 關聯式資料庫(Relational Database)是由一個或多個資料表所組成,在多個資料表間使用欄位的資料值來建立連接,以便實作資料表之間的關聯性。

10-3-1 認識關聯式資料庫 – 圖例 在關聯式資料庫是使用二維表格的資料表來儲存記錄資料,在各資料表間使用欄位值建立關聯性,透過關聯性來存取其他資料表的資料。例如:使用【學號】欄位值建立兩個資料表之間的關聯性,如右圖所示:

10-3-1 認識關聯式資料庫 – 組成 關聯式資料庫的資料是儲存在資料庫的「資料表」(Tables),每一個資料表使用「欄位」(Fields)分類成多個群組,每一個群組是一筆「記錄」(Records),例如:通訊錄資料表的記錄,如下表所示:

10-3-2 SQLite資料庫引擎 SQLite是目前世界上最廣泛使用的免費資料庫引擎,一套實作大部分SQL 92標準的函數庫,它不需要管理、不需要伺服器、也不需要安裝設定,不但體積輕巧,而且還是一套支援交易(Transaction)的SQL資料庫引擎,其官方網址為:http://www.sqlite.org/。 SQLite是Android作業系統內建的資料庫系統,其主要特點如下所示: SQLite資料庫只是一個檔案,可以直接使用檔案權限來管理資料庫,而不用自行處理資料庫的使用者權限管理,所以沒有提供SQL語言的DCL存取控制。 單一檔案的SQLite資料庫,可以讓Android應用程式很容易進行安裝,而且不用特別進行資料庫系統的設定與管理。 SQLite不需要啟動,換句話說,不會浪費行動裝置的記憶體資源。

10-3-3 SQL語言的基礎 – 說明 「SQL」(Structured Query Language)為「ANSI」(American National Standards Institute)標準的資料庫語言,可以存取和更新資料庫的記錄資料。SQLite支援的SQL指令主要分成兩大類,如下所示: 資料定義語言(Data Definition Language,DDL):建立資料表和定義資料表欄位。 資料操作語言(Data Manipulation Language,DML):資料表記錄的查詢、插入、刪除和更新。

10-3-3 SQL語言的基礎 – CREATE TABLE建立資料表 CREATE TABLE titles ( _id integer primary key autoincrement, title text no null, price real no null )

10-3-3 SQL語言的基礎 – SELECT查詢記錄(語法) SELECT 欄位1, 欄位2 FROM 資料表 WHERE conditions ORDER BY 欄位清單 SELECT指令的欄位1~2為記錄的欄位,conditions為查詢條件,使用口語來說就是「從資料表取回符合WHERE子句條件的記錄,顯示欄位1和2,並且以ORDER BY子句的欄位來排序」。

10-3-3 SQL語言的基礎 – SELECT查詢記錄("*"符號) SELECT * FROM titles

10-3-3 SQL語言的基礎 – SELECT查詢記錄(WHERE子句-1) SQL查詢如果是單一條件,在WHERE子句條件的基本規則和範例,如下所示: 文字欄位需要使用單引號括起,例如:書名為Java時的SQL指令字串,如下所示: SELECT * FROM titles WHERE title='Java' 數字欄位不需要使用單引號括起,例如:價格為600元的SQL指令,如下所示: SELECT * FROM titles WHERE price=600

10-3-3 SQL語言的基礎 – SELECT查詢記錄(WHERE子句-2) 文字和備註欄位可以使用【LIKE】包含運算子,只需包含此字串即符合條件,再配合"%"或"_"萬用字元,可以代表任何字串或單一字元,只需包含的子字串就符合條件。例如:查詢擁有Java子字串圖書資料的SQL指令,如下所示: SELECT * FROM titles WHERE titles LIKE '%Java%' 數字或日期/時間欄位可以使用<>、>、<、>=和<=不等於、大於、小於、大於等於和小於等於等運算子建立多樣化的查詢條件。

10-3-3 SQL語言的基礎 – INSERT新增記錄 SQL新增記錄INSERT指令可以新增一筆記錄例如:在titles資料表新增一筆記錄的SQL指令,如下所示: INSERT INTO titles (title, price) VALUES ('Access', 600) SQL指令的括號中是欄位清單(不用全部,但需包含所有not null欄位),字串欄位值使用單引號括起,數字沒有。

10-3-3 SQL語言的基礎 – UPDATE更新記錄 SQL更新記錄UPDATE指令是將資料表內符合條件的記錄,更新其欄位內容,例如:在titles資料表更改書價的SQL指令,如下所示: UPDATE titles SET price =650 WHERE title='Access' SQL指令的WHERE條件為書名title欄位,然後使用SET子句更新price欄位資料。

10-3-3 SQL語言的基礎 – DELETE刪除記錄 SQL刪除記錄DELETE指令是將資料表內符合條件的記錄刪除掉。例如:在titles資料表刪除記錄的SQL指令,如下所示: DELETE FROM titles WHERE title='Access' SQL指令的WHERE條件為書名title欄位,也就是將符合書名條件的圖書記錄刪除掉。

10-4 SQLite資料庫的使用 10-4-1 使用SQLiteOpenHelper類別建立資料庫與資料表 10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 10-4-3 使用SQL指令存取資料庫

10-4-1 使用SQLiteOpenHelper類別建立資料庫與資料表 – 說明 SQLiteOpenHelper類別是一個幫助我們存取SQLite資料庫的幫助類別(Helper Class),Android應用程式建立SQLite資料庫就是繼承SQLiteOpenHelper類別來覆寫相關方法,事實上,其主要目的是讓我們可以在SQLite資料庫新增資料表(因為資料庫的建立已經在父類別實作)。

10-4-1 使用SQLiteOpenHelper類別建立資料庫與資料表 - 繼承SQLiteOpenHelper類別1 在MyDBHelper(自行命名)子類別需要新增建構子,覆寫onCreate()和onUpgrade()方法,首先是建構子,如下所示: public class MyDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "MyBooks"; private static final int DATABASE_VERSION = 1; public MyDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }

10-4-1 使用SQLiteOpenHelper類別建立資料庫與資料表 - 繼承SQLiteOpenHelper類別2 我們需要覆寫onCreate()和onUpgrade()方法,如下所示: @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE titles (_id integer " + "primary key autoincrement, " + "title text no null, price real no null)"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS titles"); onCreate(db);

10-4-1 使用SQLiteOpenHelper類別建立資料庫與資料表 - 相關方法 說明 getReadableDatabase() 建立或開啟(如果存在)一個唯讀資料庫,成功開啟傳回SQLiteDatabase物件 getWritableDatabase() 建立或開啟(如果存在)一個讀寫資料庫,成功開啟傳回SQLiteDatabase物件 close() 關閉開啟的資料庫

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 – 說明

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 - 開啟可讀寫的資料庫 因為需要在資料庫新增、更新和刪除記錄,所以開啟可讀寫資料庫,通常是在Activity類別的onCreate()方法開啟資料庫,如下所示: dbHelper = new MyDBHelper(this); db = dbHelper.getWritableDatabase(); 程式碼在建立MyDBHelper物件後,呼叫getWritableDatabase()方法來取得SQLiteDatabase物件的資料庫。

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 - 關閉資料庫 關閉資料庫通常是在onStop()方法,只需呼叫SQLiteDatabase類別的close()方法,就可以關閉資料庫,如下所示: db.close();

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 - 新增記錄 SQLiteDatabase物件可以使用insert()方法來新增記錄,首先,我們需要使用ContentValues類別建立欄位值,使用put()方法加入欄位,如下所示: long id; ContentValues cv = new ContentValues(); cv.put("title", txtTitle.getText().toString()); double price = Double.parseDouble(txtPrice.getText().toString()); cv.put("price", price); 在建立後,呼叫insert()方法來新增記錄,如下所示: id = db.insert(DATABASE_TABLE, null, cv);

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 - 更新記錄 SQLiteDatabase物件可以使用update()方法來更新記錄,同樣需要使用ContentValues類別建立更新的欄位值,如下所示: ContentValues cv = new ContentValues(); double price = Double.parseDouble( txtNewPrice.getText().toString()); cv.put("price", price); count = db.update(DATABASE_TABLE, cv, "title='" + title + "'", null);

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 - 刪除記錄 SQLiteDatabase物件可以使用delete()方法來刪除記錄,如下所示: count = db.delete(DATABASE_TABLE, "title='" + title + "'", null); 方法的傳回值是影響的記錄數,第1個參數是資料表名稱,第2個就是WHERE子句的刪除條件,如果是參數條件字串,其參數值就是最後一個參數。

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 – 查詢記錄1 一般來說,如果是取出單筆的記錄資料,我們可以在query()方法加上WHERE子句的條件(不含WHERE本身),如下所示: Cursor c = db.query(DATABASE_TABLE, colNames, "_id = " + rowId , null, null, null,null); 上述程式碼指定第3個參數的條件為_id欄位值等於rowId變數,可以取回指定記錄編號的記錄資料。

10-4-2 使用SQLiteDatabase類別存取資料表的記錄資料 – 查詢記錄2 在取得Cursor物件後,我們就可以移動記錄指標來取得查詢結果的每一筆記錄,如下所示: c.moveToFirst(); for (int i = 0; i < c.getCount(); i++) { str += c.getString( c.getColumnIndex(colNames[0])) + "\t\t"; str += c.getString(1) + "\t\t"; str += c.getString(2) + "\n"; c.moveToNext(); } 程式碼首先呼叫moveToFirst()方法移至第1筆記錄,getCount()方法傳回記錄數,然後使用for迴圈來走訪每一筆記錄,moveToNext()方法可以移至下一筆。

10-4-3 使用SQL指令存取資料庫 – execSQL()方法 在第10-4-2節是使用SQLiteDatabase物件的方法來新增、更新、刪除和查詢記錄資料,事實上,我們也可以如同第10-4-1節建立資料表一般,直接使用execSQL()方法下達SQL指令來存取資料庫,如下所示: db.execSQL("INSERT INTO " + DATABASE_TABLE + " (" + "title, price) VALUES ('" + txtTitle.getText().toString() + "'," + txtPrice.getText().toString() + ")"); 上述程式碼建立SQL指令的INSERT指令來新增記錄,同理,可以建立UPDATE指令來更新記錄;DELETE指令刪除記錄資料。

10-4-3 使用SQL指令存取資料庫 – rawQuery()方法 查詢部分是使用rawQuery()方法下達SELECT指令,如下所示: Cursor c = db.rawQuery("SELECT * FROM " + DATABASE_TABLE, null); colNames = c.getColumnNames(); for (int i = 0; i < colNames.length; i++) str += colNames[i] + "\t\t"; str += "\n"; rawQuery()方法的第1個參數是SELECT指令,第2個參數是當第1個參數是參數查詢時,指定「?」符號取代的參數值,可以傳回Cursor物件,此時可以使用getColumnNames()方法取得欄位名稱陣列,然後使用for迴圈顯示查詢結果。

10-5 Storage Access Framework – 說明 Storage Access Framework(SAF)提供系統內建檔案選擇器,可以幫助我們輕鬆建立讓使用者選擇和開啟文件、圖片或其他檔案的應用程式,SAF是透過Document Providers取得檔案資訊,換句話說,只需廠商提供支援的Document Provider,我們不只可以瀏覽行動裝置的檔案系統,雲端硬碟也一樣可以使用相同介面來瀏覽與開啟檔案。 SAF是使用隱含意圖(Intent)來開啟系統內建的檔案選擇器,可以讓使用者自行建立與選擇開啟的檔案,其說明如下所示: ACTION_OPEN_DOCUMENT:開啟檔案選擇器來開啟檔案。 ACTION_CREATE_DOCUMENT:開啟檔案選擇器來建立檔案。

10-5 Storage Access Framework –建立步驟 步驟一:開啟和執行Android Studio專案 步驟二:建立使用介面的版面配置 步驟三:建立Activity活動類別

10-5 Storage Access Framework – 圖例

End