Chapter 6 数据存储 持久化
Android 系统提供三种方式:文件存储 、 SharedPreference 存储以及数据库
当然还可以保存到SD卡中 没有上述三种方式 安全
文件存储 :
存:openFileOutput
FileOutputStream android.content.ContextWrapper.openFileOutput(String name, int mode)
mode :
Context.MODE_PRIVATE \ MODE_APPEND \ MODE_WORLD_WRITEABLE \ MODE_WORLD_READABLE
默认 MODE_PRIVATE 没有创建 有则覆盖旧有文件
MODE_APPEND 文件已存在就继续添加 没有就创建新的文件
后面两个 涉及安全泄露 已被在 4.2版本弃用
主要选择前两种
private void save() {
String content = et.getText().toString().trim();
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("savedfilename", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(content);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
取 :
openFileInput
private String getSavedContent() {
FileInputStream input = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
input = openFileInput("savedfilename");
reader = new BufferedReader(new InputStreamReader(input));
String line = "";
while ((line = reader.readLine())!=null) {
content.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if (reader!=null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
//========
String content = getSavedContent();
if (!TextUtils.isEmpty(content)) {
et.setText(content);
et.setSelection(content.length());//光标迁移
}
SharedPreferences 存储
SharedPreference文件的创建三种方式
在Context 下的 getSharedPreferences(name, mode)
在Activity 下的 getPreferences(mode)//默认该activity的类名
以及通过 PreferenceManager.getDefaultSharedPreferences(this);//当前包名为前缀
mSf = getSharedPreferences("mySFName", Context.MODE_MULTI_PROCESS);
//多线程操作同一个sf
mSf = getSharedPreferences("mySFName", Context.MODE_PRIVATE);
//自定义sf文件名
mSf = getPreferences(Context.MODE_PRIVATE);
//sf名 为 当前活动的类名
mSf = PreferenceManager.getDefaultSharedPreferences(this);
//sf 名 当前包名为前缀
SQLite 数据库存储]
public class MyDataBaseHelper extends SQLiteOpenHelper {
public static final String CREATE_XXTABLE = "create table xx ("
+ "id integer primary key autoincrement, "
+ "xxname text)";
//integer 整型 // real 浮点 // text 文本类型 // blob 二进制类型 //
public MyDataBaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_XXTABLE );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
// SQLiteOpenHelper dbheHelper = new MyDataBaseHelper(context, name, factory, version);
SQLiteOpenHelper dbHelper = new MyDataBaseHelper(this, "xx.db", null, 1);
dbHelper.getWritableDatabase();//可读写 磁盘必须充足
dbHelper.getReadableDatabase();//只读 磁盘已满 也可调用
SQLiteOpenHelper dbHelper = new MyDataBaseHelper(this, "xx.db", null, 2);//执行onUpgrade()
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("ziduanming", "duiyingleixingdezhi");
values.put("ziduanming1", 12);
values.put("ziduanming2", 12.12);
db.insert("xx", null, values);
//更新name为xxx的所有数据
values.put("yaogengxindeziduanming","xindezhi");
db.update("xx", values, "name = ?", new String[]{"nameduiyingdezhi"});
//删除数据
db.delete("xx", "id = ?", new String[]{"1"});
//查询数据
// Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
Cursor cursor = db.query("xx", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
// String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
} while (cursor.moveToNext());
}
cursor.close();
//使用SQL操作数据库(结构化查询语言) Structured Query Language CRUD
db.execSQL("insert into Book (name,author,pages,price) values(?,?,?,?)",new String[]{"myName","asen","121","48"});
db.execSQL("update Book set price = ? where name = ?",new String[]{"92","myName"});
db.execSQL("delete from Book where pages > ?",new String[]{"97"});
db.rawQuery("select * from Book ", null);//除了查询数据时调用的是 SQLiteDatabase的rawQuery()方法,其他的操作方法都是调用的execSQL()方法
db.beginTransaction();
try {
//DO something about db
//db CURD
db.setTransactionSuccessful();
} catch (Exception e) {
}finally{
db.endTransaction();
}
// public static final String CREATE_STUDENT =
//"create table Student (id integer primary key autoincrement,name //text,height real)";
public static final String CREATE_STUDENT = "create table Student (id integer primary key autoincrement,name text,height real,school_id integer)";
public static final String CREATE_SCHOOL = "create table School (id integer primary key autoincrement,name text,phone integer)";
//integer 整型 // real 浮点 // text 文本类型 // blob 二进制类型 //
public MyDataBaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_STUDENT);
db.execSQL(CREATE_SCHOOL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//注意 没有break 对应的不同版本 执行 不同的多个 语句 越是低的版本 升级到最新版 执行的语句越多
switch (oldVersion) {
case 1:
db.execSQL(CREATE_SCHOOL);//从1版之后开始新建 school表
case 2:
db.execSQL("alter table Student add column school_id integer");//2版之前(1和2)创建student表是老的sql语句(被注释掉的 没有school_id这个字段) 2版之后开始插入新的字段
default:
break;
}
}