Android數據存儲

一:文件操作

     1.1 私有文件夾文件的讀取和寫入

          在Android平臺下,一個應用程序中所有的數據都是私有的,只是對自己可見的。當應用程序被安裝到系統中後,其所在的包會有一個文件夾用於存放自己的數據,只有這個應用程序纔有對這個文件夾的寫入權限。

         在這個私有文件夾中讀取文件的方式就是利用Java platform中的I/O操作,主要是字節流類,即:FileInputStream 和 FileOutputStream 這兩個class。

         I/O兩種方式:

             |--使用構造方法:FileOutputStream(File file,boolean append)

             |--調用Context.openFileInput和Context.openFileOutput 兩個方法

       第一種方法沒什麼好說的,可以看我之前的關於文件操作的文章,這裏主要講一下第二種,Context對象中不僅提供了以上兩種方法,還有其他方法:

           FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);      //返回一個FileOutputStream,如果不存在就自動創建

           FileInputStream fis = openFileInput(FILE_NAME);               // 返回一個FileInputStream對象

          String[] list =fileList()           //搜索私有文件夾下的文件,返回所有文件名組成的數組

          super.deleteFile(FILE_NAME);    //  刪除文件,成功返回true,否則返回false

          其中使用openFileOutput方法時候,會涉及到指定打開模式,默認值爲MODE_PRIVATE,值爲零,還有幾種模式:MODE_APPEND,即如果文件已存在,則不覆蓋原有數據,繼續寫入。    還有MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,這個主要用於賦予該文件讀和寫的權限

           示例,寫入文件:

         private void writeFileData(String fileName2, String message2) {
		try {
			FileOutputStream fout = openFileOutput(fileName2, MODE_PRIVATE);// 獲得FileOutputStream
			byte[] bytes = message2.getBytes(); // 將要寫入的字符串轉換爲byte數組
			fout.write(bytes);
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

          值得注意的是,現在創建的文件在Android Project下的目錄中是找不到的,因爲這是私有的,只對自己可見,但是我們依然能在DDMS中找到它:

         

  讀取文件:       

         private String readFileData(String fileName2) {
		String result = null;
		try {
			FileInputStream fin = openFileInput(fileName2);
			int length = fin.available(); // 獲得文件長度
			byte[] buffer = new byte[length]; // 創建byte數組用於讀入數據
			fin.read(buffer);
			result = EncodingUtils.getString(buffer, ENCODING);// 將byte數組轉換爲指定格式的字符串
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}


        1.2從Resources和Assets中讀取文件

               在Android中,除了私有文件夾中有文件操作之外,還可以從資源文件和Assets中讀取,這些文件由編程人員分別放在res/raw目錄和assets目錄下,用以存儲應用程序中會用到的一些數據,不過,這些文件只能讀取,不能進行寫入的操作

          示例,資源文件讀取:    

private String getFromResources(String string, int i) {
		String result = null;
		InputStream in = null;
		try {
			if (i == 0)
				in = getResources().openRawResource(R.raw.test1);//從raw中的文件獲取輸入流
			else
				in = getResources().getAssets().open(string);//從Assets中文件獲取輸入流
			int length = in.available(); // 獲得文件長度
			byte[] buffer = new byte[length]; // 創建byte數組用於讀入數據
			in.read(buffer);
			result = EncodingUtils.getString(buffer, ENCODING);// 將byte數組轉換爲指定格式的字符串
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

   

二.數據庫SQLite

        2.1創建數據庫對象

       Context.createDatabase(String name,int version ,int mode,CursorFactory factory)如果創建不成功則拋出FileNotFoundException異常,但是在實際開發中,爲方便起見,通常是寫一個數據庫輔助類來創建或者打開數據庫,這個class繼承自SQLiteOpenHelper類:

    

package sugite.game;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MySQLiteHelper extends SQLiteOpenHelper {

	public MySQLiteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);// 調用父類的構造器
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table if not exists hero_info("
				+ "id integer primary key," + "name varchar,"
				+ "level integer)");// 調用execSQL方法創建表
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}

}

       2.2,數據操作,即增刪改查

       

private String queryData(MySQLiteHelper myHelper2) {
		String result="";
		SQLiteDatabase db = myHelper.getReadableDatabase();		//獲得數據庫對象
		Cursor cursor = db.query("hero_info", null, null, null, null, null, "id asc");	//查詢表中數據
		int nameIndex = cursor.getColumnIndex("name");	//獲取name列的索引
		int levelIndex = cursor.getColumnIndex("level");	//獲取level列的索引
		for(cursor.moveToFirst();!(cursor.isAfterLast());cursor.moveToNext()){	//遍歷查詢結果集,將數據提取出來
			result = result + cursor.getString(nameIndex)+"    ";
			result = result + cursor.getInt(levelIndex)+"     \n";
		}
		cursor.close();		//關閉結果集
		db.close();			//關閉數據庫對象
		return result;
	}

	private void insertAndUpdateData(MySQLiteHelper myHelper) {
		SQLiteDatabase db = myHelper.getWritableDatabase();		//獲取數據庫對象
		//使用execSQL方法向表中插入數據
		db.execSQL("insert into hero_info(name,level) values('Hero1',1)");
		//使用insert方法向表中插入數據
		ContentValues values  = new ContentValues();//創建ContentValues對象存儲“列名-列值”映射
		values.put("name", "hero2");
		values.put("level", 2);
		db.insert("hero_info", "id", values);
		//使用update方法更新表中的數據
		values.clear();
		values.put("name", "hero3");
		values.put("level", 3);
		db.update("hero_info", values, "level = 2", null);//更新表中level爲2的那行數據
		db.close();
	}


 



 

                 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章