Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

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

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

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

4 寫入文字檔 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的字串

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

6 寫入文字檔 程式碼如下: 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();

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

8 寫入檔案 範例結果如下:

9 寫入檔案 程式碼如下: 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

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

11 讀取文字檔 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的地方

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

13 讀取文字檔 程式碼如下: 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展示出來

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

15 讀取檔案 範例結果如下:

16 讀取檔案 程式碼如下: 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();

17 SQLite

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

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

20 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為主鍵,主鍵基本上是唯一值,在一個關聯當中只會有一個主鍵。

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

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

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

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

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

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

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

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

29 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相關的指令。

30 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資料庫。

31 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的指令敘述。

32 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顯示出來

33 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回傳

34 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

35 Q&A


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

Similar presentations


Ads by Google