Chapter 8 資料存取 許多應用程式都必須記錄一些使用者資訊,例如行事曆、備忘錄等,所以在這個章節中會介紹關於在Android平台上開檔、寫檔以及使用SQLite資料庫來記錄應用程式相關資料。   本書版面, 各章前面需要放一段前言, 簡介這章的內容.

Slides:



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

第一單元 建立java 程式.
数据存储.
檔案處理.
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
Part 2 開發Android應用程式的流程
创建数据库 MySql创建数据库的语法: CREATE DATABASE 数据库名; 例: CREATE DATABASE mydb;
第二章 JAVA语言基础.
Views ,Stored Procedures, User-defined Function, Triggers
File Access 井民全製作.
创意源自激情,技术成就梦想 畅翼创新俱乐部 2012年春俱乐部第三次技术培训 赵程.
ArrayAdapter & Spinner
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
LINQ 建國科技大學 資管系 饒瑞佶.
課程名稱:資料庫系統 授課老師:李春雄 博士
SQL結構化查詢語言 SQL是 Structured Query Language 的縮寫,簡單的說,SQL是一種與資料庫溝通的共通語言,它是當時在 IBM 工作的 E.F. Codd於1970 年針對關聯式模型 ( relational model ),所建構出來的資料庫理論,也因此有了所謂關聯式資料庫的系統,但在發展的初期,由於各種關聯式資料庫系統廠商的.
JAVA vs. SQL Server 建國科技大學 資管系 饒瑞佶 2013/4 V1.
連結資料庫 ACCESS MSSQL.
JDK 安裝教學 (for Win7) Soochow University
Java 第28讲:建立删除文件 主讲教师:李焱 讲师.
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
Chapter 6 Advanced UI Design.
JAVA 程式設計與資料結構 第六章 輸出與輸入.
SQL語法 定義與操作指令.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Chapter 6 進階UI設計.
ContentProvider與資料共享
ANDROID PROGRAMMING2.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第九章 输入/输出流.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
SQL結構化查詢語言 SQL是 Structured Query Language 的縮寫,簡單的說,SQL是一種與資料庫溝通的共通語言,它是當時在 IBM 工作的 E.F. Codd於1970 年針對關聯式模型 ( relational model ),所建構出來的資料庫理論,也因此有了所謂關聯式資料庫的系統,但在發展的初期,由於各種關聯式資料庫系統廠商的.
App Inventor2呼叫PHP存取MySQL
Java 程式設計 講師:FrankLin.
生活智慧王 樹德科技大學 資訊工程系 指導教授 : 陳毓璋 教授 小組成員: 劉上緯 翁維廷 洪文財.
第五讲 JSP中的文件操作(1) 教学目的 本讲主要讲述JSP中使用Java输入、输出流实现文件的读写 操作 。 知识要点
第一單元 建立java 程式.
實驗十一:待辦事項程式 (儲存在手機上).
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
第 19 章 XML記憶體執行模式.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
12-0.開發步驟檢查 游峰碩.
SQL查询语句 蔡海洋.
挑戰C++程式語言 ──第8章 進一步談字元與字串
GridView.
GridView操作 (II).
第二章 Java语法基础.
挑戰C++程式語言 ──第7章 輸入與輸出.
Review 1~3.
陣列與結構.
SQL語法教學 2015/10/15 John.
Chapter 15 檔案存取 LabVIEW中的檔案存取函數也可將程式中的資料儲存成Excel或Word檔。只要將欲存取的檔案路徑位址透過LabVIEW中的路徑元件告訴檔案存取函數後,LabVIEW便可將資料存成Excel或Word檔;當然也可以將Excel或Word檔的資料讀入LabVIEW的程式中。
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
連結資料庫 MYSQL.
第2章 Java语言基础.
第4章 数据查询.
SQLite資料庫 靜宜大學資管系 楊子青.
Chapter 4 Multi-Threads (多執行緒).
Unix指令4-文字編輯與程式撰寫.
InputStreamReader Console Scanner
Presentation transcript:

Chapter 8 資料存取 許多應用程式都必須記錄一些使用者資訊,例如行事曆、備忘錄等,所以在這個章節中會介紹關於在Android平台上開檔、寫檔以及使用SQLite資料庫來記錄應用程式相關資料。   本書版面, 各章前面需要放一段前言, 簡介這章的內容

Java I/O 當應用程式不用記錄或處理太複雜的資料,可以簡單利用文字檔來儲存資料,反之則建議使用SQLite。本節會介紹常用的幾種Java I/O方式,並簡單介紹寫檔以及讀檔常用方法以及常用的Method。

寫入文字檔 FileWriter BufferedWriter FileWriter寫入單位為char。產生物件方式如下: 在FileWriter物件參數當中,第一個為檔案名稱,第二個為寫入模式是否為append BufferedWriter 使用Buffer機制來做write()時,會先將要寫入之檔案暫存起來,等到一定的資料量後才寫入磁碟,因此可省下不少I/O所造成的負擔。 FileWriter fw = new FileWriter( "/sdcard/output.txt", false ); 此範例中指定寫入路徑為sdcard,檔案名稱為output.txt

寫入文字檔 BufferedWriter常用Method Method 功能敘述 close() 關閉 stream flush() newLine() 寫入換行字元 write(char[] cbuf, int off, int len) 寫入長度為len的字元陣列 write(int c) 寫入一個字元 write(String s, int off, int len) 寫入一個長度為len的字串

寫入文字檔 範例結果如下:

寫入文字檔 程式碼如下: public class JavaWriteData extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { // 建立FileWriter物件,並將寫入位置設定為SD卡中的output.txt FileWriter fw = new FileWriter( "/sdcard/output.txt", false ); // 建立fw的Output Buffer BufferedWriter bw = new BufferedWriter( fw ); bw.write("Hello, Android"); bw.newLine(); bw.close(); } catch (IOException e) { e.printStackTrace();

寫入檔案 FileOutputStream 此種方式是以byte為單位對檔案作存取,故通常在使用這種方式來做檔案讀寫時會一起使用其他Object的OutputStream,目的是將我們要儲存的目標檔案自動以byte的形式作儲存

寫入檔案 範例結果如下:

寫入檔案 程式碼如下: public class JavaOutputStream extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { String data1 = "This is OutputStream data"; String data2 = "\n"; FileOutputStream output = new FileOutputStream("/sdcard/output.txt"); output.write(data1.getBytes()); output.write(data2.getBytes()); output.close(); } catch (Exception e) { e.printStackTrace(); 程式一開始指定兩個字串,一為"This is OutputStream data",另一為換行字元,接著建立一個FileOutputStream物件並將檔案位置設定為sdcard中的output.txt,接著使用write()來寫入字串,由於FileOutputStream是以byte為基本單位,故必須將write()當中的字串以byte的形式來儲存,如範例所示,利用getBytes()來將字串內容換為byte

讀取文字檔 FileReader BufferedReader FileReader讀取單位為char。產生物件方式如下: FileReader fr = new FileReader( "/sdcard/output.txt" ); BufferedReader br = new BufferedReader( fr );

讀取文字檔 BufferedWriter常用Method Method 功能敘述 close() 關閉 stream mark(int readAheadLimit) 標記此stream現在的讀取位置 markSupported() 布林值,看此stream是否支援標記 read() 讀取一個字元 read(char[] cbuf, int off, int len) 讀取自訂長度字串至陣列中 readLine() 讀取一整行 ready() 布林值,看此stream是否準備好被讀取 reset() 重設stream至最近mark的地方

讀取文字檔 範例結果如下:

讀取文字檔 程式碼如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { // 建立FileReader物件,設定讀取的檔案為SD卡中的output.txt FileReader fr = new FileReader( "/sdcard/output.txt" ); // 建立fr的Input Buffer BufferedReader br = new BufferedReader( fr ); String readData = ""; String temp = br.readLine(); while( temp != null ) { readData += temp; temp = br.readLine(); } Context context = getApplicationContext(); int duration = Toast.LENGTH_LONG; Toast toast = Toast.makeText(context, readData, duration); toast.show(); catch (Exception e) { e.printStackTrace(); 程式一開始建立FileReader和BufferedReader物件,並將兩物件作連結,宣告一個temp的字串用來暫時讀檔案時的一行字串,當整個文字檔讀取完畢時temp值會變為null,此時會跳出迴圈,這時readData即為整個文字檔的文字內容,最後將readData用toast展示出來

讀取檔案 FileInputStream 此種方式如同FileOutputStream是以byte為單位,故此方法通常也用於不同物件的讀取

讀取檔案 範例結果如下:

讀取檔案 程式碼如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { FileInputStream input = new FileInputStream("/sdcard/output.txt"); String data = ""; while (input.available() > 0) { byte [] b = new byte[10]; if ( input.read(b) != -1 ) data += new String(b); else break; } Context context = getApplicationContext(); int duration = Toast.LENGTH_LONG; Toast toast = Toast.makeText(context, data, duration); toast.show(); catch (Exception e) { e.printStackTrace();

SQLite

SQLite SQLite 特色: 不需要一個額外的系統來運行整個資料庫系統 寫入或是讀取資料都是直接連結到檔案中 由於都以檔案型式存在,所以可以將此資料隨意在大部分平台下使用 支援大部分SQL92的語法 運行資料庫操作時所佔用的資源較小

SQL語法簡介 CREATE TABLE Create table用來建立表格,而表格分為列(row)和欄(column),而表格當中的資料可以有不同的資料型態 CREATE TABLE 資料表名稱 ( 欄位一 資料型態, 欄位二 資料型態, 欄位三 資料型態, ‧ 欄位N 資料型態 ) ;

SQL語法簡介 CREATE TABLE 範例 CREATE TABLE STUDENTINFO ( ID INTEGER NOT NULL, NAME CHAR(20) NOT NULL, PHONE CHAR(20) , CLASS CHAR(50) , PRIMARY KEY(ID) ); 在此資料表當中用到了四個欄位,學號(ID)、姓名(NAME)、電話(PHONE)以及班級(CLASS),除了學號設定為整數(INTEGER)之外,其他三個都宣告為字串,CHAR括號內的數字為字串長度,在欄位最後面的NOT NULL代表當有資料要新資到資料庫時,此欄位不可為空的,在這範例中規範ID和NAME是必須輸入的資料,PHONE和CLASS則可有可無。在TABLE中最後一行有個PRIMARY KEY(ID),意思是定義ID為主鍵,主鍵基本上是唯一值,在一個關聯當中只會有一個主鍵。

SQL語法簡介 CREATE TABLE 範例結果:

SQL語法簡介 ALTER TABLE Alter table用來更改Table,如新增、刪除、更改欄位屬性或名稱,更改指令如下表: 功能敘述 ADD 欄位名稱 資料型態 新增欄位 RENAME TO 新的Table名稱 更改Table名稱 ALTER TABLE 資料表名稱 指令

SQL語法簡介 DROP TABLE Drop table指令為刪除一個表格,其用法如下: DROP TABLE 表格名稱

SQL語法簡介 INSERT Insert指令用於將資料輸入到表格當中,使用方法如下: INSERT INTO 資料表名稱 ( '欄位一', '欄位二', … , '欄位N' ) VALUES ( '值一', '值二', … , '值N' )

SQL語法簡介 SELECT Select指令用於查詢資料庫當中符合條件的資料,使用方法如下: SELECT 欄位名稱(可多個欄位) FROM 表格名稱

SQL語法簡介 UPDATE Update指令可修改資料表當中的值,使用方法如下: UPDATE 資料表名稱 SET '欄位一'=新值 WHERE 條件

SQL語法簡介 DELETE Delete指令可將符合條件的資料給刪除,使用方法如下: DELETE FROM 表格名稱 WHERE 條件

SQLite環境介紹 使用adb工具進入模擬器中,接著在模擬器當中使用sqlite3這個工具,使用方法為: sqlite3 example1 在sqlite3後面空一格後接要連結的sqlite database的檔案,若無此檔案則會建立一個新的,當成功進入sqlite模式後可看到目前使用的版本以及sqlite>命令列

SQLite開發 – EX1 src/ncu/bnlab/MyDatabase.java public class MyDatabase extends SQLiteOpenHelper { public MyDatabase(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 在範例中,會用到最基本的兩個Class,第一個為MyDatabase,此Class是從SQLiteOpenHelper擴展而來,在SQLiteOpenHelper當中會有兩個基本元件,一為onCreate,另一個為onUpgrade。當資料庫第一次建立時,會呼叫onCreate,而onUpgrade用於當資料庫需要更改時,例如升級版本,通常在此函式中會用到一些DROP或CREATE相關的指令。

SQLite開發 – EX1 src/ncu/bnlab/sqliteExample.java public class sqliteExample extends Activity { // 設定DATABASE檔案名稱 private final String DATABASE_NAME = "example1"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MyDatabase myDBHelper = new MyDatabase(this, DATABASE_NAME, null, 3); } 當有了MyDatabase這個Class時,就可以建立一個資料庫物件,如下:   MyDatabase myDBHelper = new MyDatabase(this, DATABASE_NAME, null, 3); 而在建構物件時,需要四個參數,context、database、factory、version四個參數,在此需要注意的是資料庫名稱以及版本。 在這基本架構中,會將資料庫建立在【data/data】內的ncu.bnlab.sqliteExample資料夾內,此資料夾中會有一個【databases】資料夾,在裡面即為所建立之example1的sqlite資料庫。

SQLite開發 – EX2 src/ncu/bnlab/MyDatabase.java public class MyDatabase extends SQLiteOpenHelper{ public String DATABASE_TABLE = "STUDENTINFO"; public final String DB_CREATE_TABLE = "CREATE TABLE " + DATABASE_TABLE + "( " + "ID INTEGER NOT NULL," + "NAME CHAR(20) NOT NULL," + "PHONE CHAR(20)," + "CLASS CHAR(50)," + "PRIMARY KEY(ID) );"; public MyDatabase(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DB_CREATE_TABLE); public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { // TODO Auto-generated method stub db.execSQL("DROP IF TABLE EXISTS " + DATABASE_TABLE); onCreate(db); 接著開始慢慢加入一些基本功能,如CREATE、DROP、INSERT、DELETE、SELECT等功能,一開始需要為資料庫建立一個STUDENTINO的表格,故在MyDatabase.java中宣告一個String,將CREATE指令放置此字串當中,在onCreate時讓程式幫我們把表格建立起來。 在SQLiteDatabase提供提供幾個執行SQL的方法,如上述程式碼中的execSQL,此方法參數為SQL指令,但在execSQL中只能使用如CREATE、DROP、DELETE、INSERT的指令敘述。

SQLite開發 – EX4 src/ncu/bnlab/sqliteExample.java public class sqliteExample extends Activity { private final String DATABASE_NAME = "example1"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MyDatabase myDBHelper = new MyDatabase(this, DATABASE_NAME, null, 3); SQLiteDatabase db = myDBHelper.getWritableDatabase(); // 搜尋STUDENTINFO資料表中的資料 String cmd = "SELECT * FROM STUDENTINFO;"; Cursor result = db.rawQuery(cmd, null); result.moveToNext(); // 將結果以AlertDialog的方式輸出 for( int i = 0; i < result.getColumnCount() ;i++ ) { String data = result.getString(i); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(data); builder.show(); } SELECT指令要使用SQLiteDatabase中的rawQuery方法 Cursor所存的值會以column型式存在,而在取值時必須先使用moveToNext此方法來將資料指向第一筆,之後才可以正確存取Cursor內的資料,若再取值之前沒有先使用moveToNext則會導致取值時出錯,因初始指向的位置是類似資料header的位置而不是資料本身的位置。在範例中使用getColumnCount得到總共有幾個column,即為查詢到的資料數量,利用迴圈將取出之資料用AlertDialog顯示出來

SQLite開發 常用Cursor如下表 型別 Method 功能敘述 void close() 關閉Cursor並釋放其資源 int getColumnCount() 回傳Cloumn數量 getColumnIndex(String columnName) 回傳輸入之欄位的欄位索引值 String getColumnName(int columnIndex) 回傳對應之索引值的欄位名稱 String[] getColumnNames() 回傳欄位名稱字串陣列 getCount() 回傳資料列數 getPosition() 回傳現在資料在哪一列 getString(int columnIndex) 將此欄位資料以String回傳 douoble getDouble(int columnIndex) 將此欄位資料以Double回傳 float getFloat(int columnIndex) 將此欄位資料以Float回傳 getInt(int columnIndex) 將此欄位資料以int回傳 long getLong(int columnIndex) 將此欄位資料以Long回傳

SQLite開發 常用Cursor如下表 型別 Method 功能敘述 boolean isFirst() isLast() 看目前Cursor位置是否在最後面 isNull(int columnIndex) 看指定欄位值是否為Null move(int offset) 移動Cursor位置至指定的offset moveToFirst() 移動Cursor位置到最前面 moveToLast() 移動Cursor位置到最後面 moveToNext() 移動Cursor到下一個位置 moveToPrevious() 移動Cursor到前一個位置 moveToPosition(int position) 移動Cursor到絕對位置 requery() 重新做Query

Q&A