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