應用程式都會涉及到資料的輸入、輸出,android應用也不例外。Android中應用程式儲存資料通常有兩種模式:1,資料量少,格式簡單(例如,字串、標量),使用普通文本就好,可以使用Android系統提供的SharedPreferences儲存;2、需要大量的資料存放區訪問,可以藉助資料庫,android系統提供了內建SQLite資料庫,而且為訪問資料庫提供了方便的API。本片文章將會詳細講述如何在Android中使用資料庫。
1、使用SharedPreferences訪問key-value對和使用Editor寫入資料
在一些小應用中,比如遊戲的玩家積分(飛機大戰之類的)、應用程式的配置資訊(是否開啟音效、震動等),使用SharedPreferences儲存,這個方法儲存的資料主要是簡單類型的key-value對。
SharedPreferences提供的成員函數主要有三個:
》boolean contians(String key)
》abstract Map getAll(); 擷取SP資料裡面的全部資料
》boolean getXxx(String key,xxx defVlaue) :擷取key的值。
SharedPreferences並沒有寫入資料的能力,需要調用edit()方法來擷取對應的Editor()。
》SharedPreferences.Editor clear() :清空SharedPreferences裡面所有的額資料
》SharedPreferences.Editor putXxx(String key, xxx value):向SharedPreferences存入key值
》boolean 層哦秘密他() :當完成editot編譯,提交改方法,通常寫在末尾。
SharedPreferences是一個介面,程式無法直接建立SharedPreferences執行個體,需要通過Context提供getSharedPreferences(Stirng name,int mode)來建立執行個體。
第二個參數如下:
》Context.MODE_PRIVATE :指定改資料只能被本程式讀寫
》Context.MODE_WORLD_READABLE:可以被其他程式讀,但不能寫
》Context.MODE_WORLD_WRITEABLE:課被其他讀寫。
常式如下:提供兩個按鈕,一個寫入資料,另一個讀取寫入的資料。
1、activity下的.java檔案如下:
package org.crazyit.io;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/** * Description: *
site: crazyit.org *
Copyright (C), 2001-2012, Yeeku.H.Lee *
This program is protected by copyright laws. *
Program Name: *
Date: * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */public class SharedPreferencesTest extends Activity{SharedPreferences preferences;SharedPreferences.Editor editor;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 建立SharedPreferences執行個體,名字、可讀preferences = getSharedPreferences("crazyit", MODE_WORLD_READABLE);editor = preferences.edit();Button read = (Button) findViewById(R.id.read);Button write = (Button) findViewById(R.id.write);read.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){//擷取time的字串String time = preferences.getString("time", null);//讀取int的隨機數int randNum = preferences.getInt("random", 0);String result = time == null ? //?判斷"您暫時還未寫入資料": "寫入時間:" + time + "\n上次隨機產生的隨機數為:" + randNum;//toast提示Toast.makeText(SharedPreferencesTest.this , result , Toast.LENGTH_LONG).show();}});write.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "+ "hh:mm:ss");// 存入目前時間editor.putString("time", sdf.format(new Date()));// 存入隨機數editor.putInt("random", (int) (Math.random() * 100));// 提交資料editor.commit();}});}}
2、res下面的布局檔案:
3、AVD調試結果如下:
開啟DDMS調試可以知道,sharedpreferences資料總是儲存在/data/data//shared_prefs目錄下面以.xml形式儲存。
2、File儲存
Java提供了一套完整的IO流體系,包括FileInPutSream、FileOutPutStream,通過這些IO流來訪問磁碟檔案,android同樣支援以這種方式來訪問手機儲存空間的檔案。
Context提供了兩種方法來開啟檔案應用程式下的資料檔案IO流:
》 public FileInputStream openFileInput (String name) :開啟輸入資料流檔案name
》 public FileOutputStream openFileOutput (String name, int mode) :開啟輸出資料流檔案name
這裡解釋一下輸入資料流和輸出資料流:輸入資料流指的是從硬碟等儲存空間中讀資料到記憶體中,軟體在記憶體中運行;輸出資料流指的是從記憶體中讀資料到外部儲存空間中。
mode參數主要有:
》MODE_PRIVATE :指定改資料只能被本程式讀寫
》MODE_APPEND :以追加方式開啟,可向該檔案夾中追加內容
》MODE_WORLD_READABLE:可以被其他程式讀,但不能寫
》MODE_WORLD_WRITEABLE:可被其他讀寫。
除此之外,Context還提供了如下方法來訪問應用程式的檔案夾。 》getDir(String name, int mode) : 在應用程式的資料檔案下擷取或建立name對於的子檔案夾 》File getFileDir() :擷取應用程式的資料檔案的絕對路徑 》String fileList() :返迴文件檔案夾list 》deleteFile(String name) :刪除name檔案 下面根據常式來分析:兩個文字框,兩個按鈕,第一組用於寫入檔案名稱字和存入;第二組用於讀取檔案,並顯示。
1、activity下的.java
package wqt.list.filereadwrite;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.PrintStream;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity {final String File_name="Read_Write";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button read=(Button)findViewById(R.id.read);Button write=(Button)findViewById(R.id.write);final EditText edit1=(EditText) findViewById(R.id.edit1);final EditText edit2=(EditText) findViewById(R.id.edit2);write.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//將wdit1中的內容寫入到檔案中write(edit1.getText().toString()); //write函數在下面需要定義edit1.setText("");}});read.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubedit2.setText(read()); //read函數需要在下面定義}});}private String read(){try{//開啟檔案輸入資料流FileInputStream fis =openFileInput(File_name );byte[] buff = new byte[1024];int hadRead =0;StringBuilder sb = new StringBuilder("");while( (hadRead = fis.read(buff)) > 0){sb.append(new String(buff,0,hadRead));} return sb.toString();}catch(Exception e){e.printStackTrace();}return null;}private void write(String content){try{//使用追加模式開啟檔案輸出資料流FileOutputStream fos = openFileOutput(File_name, MODE_APPEND);PrintStream ps=new PrintStream(fos);ps.println(content);ps.close();}catch(Exception e){e.printStackTrace();}}}
2.res下的layout檔案.xml
3、AVD調試: