本章主要介紹Android的輸入、輸出支援,Android為檔案IO提供了openFileOutput和openFileInput兩個便捷的方法;為記錄、訪問應用程式的參數、選項提供了SharedPreferences工具類,可以方便地讀、寫參數選項;除此之外,重點掌握的是SQLite資料庫,Android內建SQLite資料庫,且為此提供了大量方便的工具類;最後,手勢支援和自動朗讀也算是Android的特別的輸入、輸出。!
【知識點】·SharedPreferences和Editor簡介: 有些時候,應用程式有少量的資料需要儲存,而且這些資料的格式簡單:都是普通的字串、標量類型的值等,比如應用程式的各種配置資訊(如是否發開音樂、是否使用震動效果等)、玩家積分)等,對於這種資料,Android提供了SharedPreferences進行儲存。SharedPreferences儲存的資料主要是類似於配置資訊格式的資料,因此它儲存的資料主要是簡單類型的key-value對。SharedPreferences介面主要負責讀取應用程式的Preferences資料,它提供了如下常用方法訪問SharedPreferences中的key-value對: boolean contains(String key):判斷SharedPreferences是否包含特定key的資料。
abstract Map getAll():擷取全部的key-value對。
boolean getXxx(String key,xxx defValue):擷取SharedPreferences資料裡指定key對應的value。如果key不存在,返回預設值defValue。其中xxx可以是boolean、float、int、long、String等各種基本類型。
SharedPreferences介面並沒有提供寫入資料的能力,而是通過SharedPreferences的內部介面,SharedPreferences調用edit()方法即可擷取它對應的EditZ喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcrbUz/OjrEVkaXRvcszhuanI58/Ct723qM/yU2hhcmVkUHJlZmVyZW5jZXPQtMjryv2+3aO6CjxibG9ja3F1b3RlPgpTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgIGNsZWFyo6ijqaO6x+W/1VNoYXJlZFByZWZlcmVuY2VzwO+1xMv509DK/b7doaMgClNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciAgcHV0WHh4o6hTdHJpbmcga2V5o6x4eHggdmFsdWWjqaO6z/JTaGFyZWRQcmVmZXJlbmNlc7TmyOvWuLaoa2V5ttTTprXEyv2+3aGjxuTW0Hh4eL/J0tTKx2Jvb2xlYW6homZsb2F0oaJpbnShomxvbmeholN0cmluZ7XIuPfW1rv5sb7A4NDNoaMKU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yICByZW1vdmWjqFN0cmluZyBrZXmjqaO6yb6z/VNoYXJlZFByZWZlcmVuY2VzwO/WuLaoa2V5ttTTprXEyv2+3c/uoaMKYm9vbGVhbiBjb21taXSjqKOpo7q1sUVkaXRvcrHgvK3N6rPJuvOjrLX308O4w7e9t6jM4b270N64xKGjCjwvYmxvY2txdW90ZT4KICAgIApTaGFyZWRQcmVmZXJlbmNlc7G+ye3Kx9K7uPa907/ao6yzzNDyzt63qNaxvdO0tL2oU2hhcmVkUHJlZmVyZW5jZXPKtcD9o6zWu8Tczai5/UNvbnRleHTM4bmptcRnZXRTaGFyZWRQcmVmZXJlbmNlc6OoU3RyaW5nIG5hbWWjrGludCBtb2Rlo6m3vbeou/HIoVNoYXJlZFByZWZlcmVuY2VzyrXA/aGjU2hhcmVkUHJlZmVyZW5jZXPK/b7d19zKx7GjtObU2i9kYXRhL2RhdGEvPHBhY2thZ2UKIG5hbWU+L3NoYXJlZF9wcmVmc8S/wrzPwqOs0tRYTUwmIzI2Njg0O8q9saO05qOsuPnUqsvYzqo8bWFwLi4uLz6howo8YnI+CgqhpLbBoaLQtMbky/zTptPDU2hhcmVkUHJlZmVyZW5jZXM6CiAgICDHsMzho7q0tL2ouMNTaGFyZWRQcmVmZXJlbmNlc7XE06bTw7PM0PLWuLaoz+DTprXEt8POysioz96jrNa4tqhNT0RFX1dPUkxEX1JFQURBQkxFv8mxu8bky/zTptPDs8zQ8rbByKGjrNa4tqhNT0RFX1dPUkxEX1dSSVRFQUJMRb/JsbvG5Mv806bTw7PM0PLQtMjroaMKICAgILK91uijugogICAgotm0tL2oxuTL/LPM0PK21NOmtcRDb250ZXh0o6zI58/CtPrC66O6CjxwcmUgY2xhc3M9"brush:java;">useCount=createPackageContext(“org.lxj.io”,Context.CONTEXT_IGNORE_SECURITY);//其中“org.lxj.io”是其它程式的包名 ②調用其它程式Context的getSharedPreferences(String name,int mode)即可擷取相應的SharedPreferences對象。 ③如果需要想其他醫用的SharedPreferences資料寫入資料,調用SharedPreferences的edit()方法擷取Editor即可。
·File儲存: 1)openFileOutput和openFileInput Context提供了如下兩個方法來開啟應用程式的資料檔案夾裡的檔案IO流:
FileInputStream openFileInput(String name):開啟應用程式的資料檔案夾下的name檔案對應輸入資料流。FileOutputStream openOutput(String name,int mode):開啟應用程式的資料檔案夾下的name檔案對應輸出資料流。第二個參數指定開啟檔案模式:
除此外,Context還提供如下方法訪問應用程式的資料檔案夾:
getDir(String name,int mode):在應用程式的資料檔案夾下擷取或建立name對應的子目錄。File getFilesDir():擷取該應用程式的資料檔案夾的絕對路徑。String[ ] fileList():返回該應用程式的資料檔案夾下的全部檔案。deleteFile(String):刪除該應用程式的資料檔案夾下的指定檔案。
2)讀寫SD卡上的檔案 為了更好地存、取應用程式的大檔案資料,應用程式需要讀、寫SD卡上的檔案。SD卡大大擴充手機的儲存能力。讀、寫SD上的檔案的步驟: ①調用Environment的getExternalStorageState()方法判斷手機上是否插入了SD卡,並且應用程式有讀寫SD卡的許可權。如下代碼:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);//如果插入SD卡,並且程式有讀寫SD卡的許可權,返回true
②調用Environment的getExternalStorageDirectory()方法來擷取外部儲存空間,也就是SD卡的目錄。 ③使用FileInputStream、FileOutputStream、FileReader或FileWriter讀、寫SD卡裡的檔案。 ④為了有讀寫SD的許可權,在AndroidAManifest.xml檔案中要添加如下兩條配置:
·SQLiteDatabase SQLite只是一個嵌入式的資料庫引擎,專門適用於資源有限的裝置上(如手機、PDA等)適量資料存取。SQLite只是一個檔案。Android提供了SQLiteDatabase代表一個資料庫(底層就是一個資料庫檔案),一旦應用程式獲得了代表指定資料庫的SQLiteDatabase對象,接下來就可通過SQLiteDatabase對象來管理、操作資料庫了。SQLiteDatabase提供了如下靜態方法開啟一個檔案對應的資料庫:
static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags):開啟path檔案代表的SQLite資料庫.static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabaseCursorFactory factory):開啟或建立(如果不存在)file檔案所代表的SQLite資料庫.static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabaseCursorFactory factory):開啟或建立(如果不存在)path檔案所代表的SQLite資料庫.
在程式中擷取SQLiteDatabase對象之後,接下來就可調用SQLiteDatabase的如下方法來操作資料庫:
execSQL(String sql,Object[ ] bindArgs):執行帶預留位置的SQL語句。execSQL(String sql):執行SQL語句。insert(String table,String nullColumnHack,ContentValues values):向執行表中插入資料。update(String table ,ContentValues values,String whereClause,String[ ] whereArgs):更新特定表中的特定資料delete(String table,String whereClause,String[ ] whereArgs):刪除指定表中的特定資料。
Cursor query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy):對執行資料表執行查詢。
Cursor query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):對執行資料表執行查詢。limit參數控制最多查詢幾條記錄(用於控制分頁的參數)。
Cursor query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):對指定表執行查詢語句。其中第一個參數控制是否取出重複值。 rawQuery(String sql,String[ ] selectionArgs):執行帶預留位置的SQL查詢。beginTransaction():開始事物。endTransaction():結束事物。
上面查詢方法都是返回一個Cursor對象,Cursor提供了如下方法來移動查詢結果的記錄指標:
move(int offset):將記錄指標向上或向下移動指定的行數,offset為整數時向下移,為負數時向上移boolean moveToFirst():將記錄指標移動到第一行,如果移動成功則返回trueboolean moveToLast():將記錄指標移動到最後一行,如果移動成功則返回trueboolean moveToNext():將記錄指標移動到下一行,如果移動成功則返回trueboolean moveToPosition(int position):將記錄指標移動到指定的行,如果移動成功則返回trueboolean moveToPrevious():將記錄指標移動到上一行,如果移動成功則返回true
一旦將記錄指標移動到指定行之後,接下來就可以調用Cursor的getXxx()方法擷取改行指定列的資料。 ·使用SQL語句操作SQLite資料庫: SQLiteDatabase的execSQL方法可執行任意SQL語句,包括帶預留位置的SQL語句。但由於該方法沒有返回值,一般用於執行DDL語句或DML語句:如果需要執行查詢語句,可以調用SQLiteDatabase的rawQuery(String sql,String[ ] selectionArgs)方法。範例程式碼如下:
db.execSQL("insert into news_inf values(null,?,?)",new String[] {title,content}); //執行插入語句 使用SQLiteDatabase進行資料庫操作的步驟如下: ①擷取SQLiteDatabase對象,它代表了與資料庫的串連。 ②調用SQLiteDatabase的方法來執行SQL語句。 ③操作SQL語句的執行結果,比如用SimpleCursorAdapter封裝Cursor。 ④關閉SQLiteDatabase,回收資源。 ·事務: SQLiteDatabase中包含如下兩個方法來控制事務: beginTransaction():開始事務。 endTransaction():結束事務。 除此之外,SQLiteDatabase還提供了如下方法判斷當前上下文是否處於事務環境中。 inTransaction():如果當前上下文處於事務中,返回true,否則返回false; 當程式執行endTransaction()方法時將會結束事務--到底是提交事務,還是復原事務?取決於SQLiteDatabase是否調用了setTransactionSuccessful()方法來設定事務標誌,如果程式事務執行中調用該方法設定了事務成功則提交事務,否則程式將復原事務。範例程式碼:
db.beginTransaction();//開始事務try{ //執行DML語句 ... //調用該方法設定事務成功。否則endTransaction()方法將復原事務 db.setTransactionSuccessful();}finally{ //由事務的標誌決定是提交事務還是復原事務 db.endTransaction();}
·SQLiteOpenHelper類: SQLiteOpenHelper是Android提供的一個管理資料庫的工具類,可用於管理資料庫的建立和版本更新。一般的用法是建立SQLiteOpenHelper的子類,並擴充它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)方法。 SQLiteOpenHelper包含如下常用的方法:
synchronized SQLiteDatabase getReadableDatabase():以讀寫的方式開啟資料庫對應的SQLiteDatabase對象synchronized SQLiteDatabase getWritableDatabase():以寫的方式開啟資料庫對應的SQLiteDatabase對象abstract void onCreate(SQLiteDatabase db):當第一次建立資料庫時回調該方法abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):當資料庫版本更新時回調該方法synchronized void close():關閉所有開啟的SQLiteDatabase
一旦得到了SQLiteOpenHelper對象之後,程式無需使用SQLiteDatabase的靜態方法建立SQLiteDatabase執行個體,而且可以用getWritableDatabase()或getReadableDatabase()方法來擷取一個用於操作資料庫的SQLiteDatabase執行個體。
·手勢支援: Android提供了一個GestureDetector類,GestureDetector執行個體代表了一個手勢檢測器,建立GestureDetector時需要傳入一個GestureDetector.OnGestureDetectorListener執行個體,就是一個監聽器,負責對使用者手勢行為提供響應。Android還允許應用程式把使用者手勢添加到指定的檔案中,使用GestureLibrary來代表手勢庫,並提供GestureLibraries工具類來建立手勢庫,提供recognize(Gesture ges)方法來識別手勢,該方法返回ArrayList,其中Prediction封裝了手勢的匹配資訊,Prediction對象的name屬性代表了匹配的手勢名,score屬性代表了手勢的相似度。
·自動朗讀(TTS): 主要通過TextToSpeech來完成,該類提供了一個構造器: TextToSpeech(Context context,TextToSpeech.OnInitListener listener) 獲得了TextToSpeech對象之後,就可調用TextToSpeech的setLanguage(Locale loc)方法來設定該TTS應使用的語言、國家選項。當程式用完了TextToSpeech對象之後,可以在Activity的OnDestroy()方法中調用它的shutdown()來關閉TextToSpeech、釋放它所佔用的資源。