Android I/O 說明

Download Report

Transcript Android I/O 說明

Chapter 8
資料存取
Java I/O
寫入文字檔
• FileWriter
– FileWriter寫入單位為char。產生物件方式如下:
FileWriter fw = new FileWriter( "/sdcard/output.txt", false );
– 在FileWriter物件參數當中,第一個為檔案名稱,
第二個為寫入模式是否為append
• BufferedWriter
– 使用Buffer機制來做write()時,會先將要寫入之
檔案暫存起來,等到一定的資料量後才寫入磁
碟,因此可省下不少I/O所造成的負擔。
寫入文字檔
• BufferedWriter常用Method
Method
功能敘述
close()
關閉 stream
flush()
清除 stream
newLine()
寫入換行字元
write(char[] cbuf, int off, int len)
寫入長度為len的字元陣列
write(int c)
寫入一個字元
write(String s, int off, int len)
寫入一個長度為len的字串
寫入文字檔
• 範例結果如下:
寫入文字檔
• 程式碼如下:
import java.io.FileWriter;
import java.io.BufferedWriter;
try {
// 建立FileWriter物件,並將寫入位置設定為SD卡中的output.txt
FileWriter fw = new FileWriter( "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的形式作儲存
寫入檔案
• 範例結果如下:
寫入檔案
• 程式碼如下:
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) {
}
讀取文字檔
• FileReader
– FileReader讀取單位為char。產生物件方式如下:
FileReader fr = new FileReader( "/sdcard/output.txt" );
• BufferedReader
讀取文字檔
• 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();
}
}
讀取檔案
• FileInputStream
– 此種方式如同FileOutputStream是以byte為單位,
故此方法通常也用於不同物件的讀取
讀取檔案
• 範例結果如下:
讀取檔案
import java.io.FileInputStream;
FileInputStream input;
• 程式碼如下:
input = openFileInput(“hello.txt");
String data = "";
while (input.available() > 0) {
byte [] b = new byte[10];
if ( input.read(b) != -1 )
data += new String(b);
else
break;
}
input.close();
setTitle( “資料內容:"+data);
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) );
SQL語法簡介
• CREATE TABLE 範例結果:
SQL語法簡介
• ALTER TABLE
– Alter table用來更改Table,如新增、刪除、更改
欄位屬性或名稱,更改指令如下表:
功能敘述
功能敘述
ADD 欄位名稱 資料型態
新增欄位
RENAME TO 新的Table名稱
更改Table名稱
– Alter 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
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
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
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);
}
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);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP IF TABLE EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
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();
}
}
}
SQLite開發
• 常用Cursor如下表
型別
void
int
int
Method
close()
getColumnCount()
getColumnIndex(String columnName)
String
getColumnName(int columnIndex)
String[]
int
int
String
douoble
float
int
long
getColumnNames()
getCount()
getPosition()
getString(int columnIndex)
getDouble(int columnIndex)
getFloat(int columnIndex)
getInt(int columnIndex)
getLong(int columnIndex)
功能敘述
關閉Cursor並釋放其資源
回傳Cloumn數量
回傳輸入之欄位的欄位索引
值
回傳對應之索引值的欄位名
稱
回傳欄位名稱字串陣列
回傳資料列數
回傳現在資料在哪一列
將此欄位資料以String回傳
將此欄位資料以Double回傳
將此欄位資料以Float回傳
將此欄位資料以int回傳
將此欄位資料以Long回傳
SQLite開發
• 常用Cursor如下表
型別
boolean
Method
isFirst()
boolean
isLast()
boolean
boolean
isNull(int columnIndex)
move(int offset)
boolean
boolean
boolean
boolean
boolean
boolean
moveToFirst()
moveToLast()
moveToNext()
moveToPrevious()
moveToPosition(int position)
requery()
功能敘述
看目前Cursor位置是否在
最前面
看目前Cursor位置是否在
最後面
看指定欄位值是否為Null
移動Cursor位置至指定的
offset
移動Cursor位置到最前面
移動Cursor位置到最後面
移動Cursor到下一個位置
移動Cursor到前一個位置
移動Cursor到絕對位置
重新做Query
課後習題
1.
再範例中介紹的兩種寫檔以及讀檔有何差異?
2.
如何指定寫入路徑至SD卡當中?
3.
SQLite與MySQL、Oracle等資料庫系統中有什麼差異?
4.
SQLite是否完全支援SQL92的語法?
5.
如何在adb shell環境下使用SQLite?此工具在SDK當中的哪裡?
6.
當我們對資料庫下Query查詢後,要用什麼方式將結果儲存起
來?
Q&A