一:文件操作
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();
}