您的位置:首页 > 移动开发 > Android开发

android应用程序数据持久化

2014-12-14 21:37 190 查看
所谓持久化是为了将数据保存起来,程序退出或者是手机关机以后,再次运行程序,能获取到上次运行的数据。目前数据持久化保存的方式有三种。1. 保存至文件。2. 使用google自带的SharedPreferences。3. 使用sqlite。1. 保存至文件
FileOutputStream fos = this.openFileOutput("data.txt", Context.MODE_PRIVATE);
通过上下文就可以获取字节流。openFileOutput第一个参数不需要制定路径。它的路径为/data/data/<包名>/files。第二个参数,一般取值为MODE_PRIVATE。
FileInputStream fis = this.openFileInput("data.txt");
通过上下文获取字节读取流。可以指定在/data/data/<包名>/files的文件。通过以上两步就可以实现数据的保存。一般情况这种方式用得很少。一些结构化的数据保存在普通文件中,操作起来还是不方便。2.通过SharedPreferences实现数据的保存使用SharedPreferences还是很常见的,一些配置信息通过它保存,操作起来很方便。a. 如何获取SharedPreferences对象呢?getSharedPreferences(文件名称,mode)通过上下文获取SharedPreferences对象,可以指定具体的文件名。getPreferences(mode) 通过上下文获取SharedPreferences对象,文件不可以指定,使用当前的activity名称作为具体名称。PreferenceManager.getDefaultSharedPreferences(context) 这种方式获取的SharedPreferences对象,是使用当前的包名作为具体的文件名称。b.如何保存数据?
Editor edit = sp.edit();
edit.putBoolean("boolean", false);
edit.putFloat("float", 1f);
edit.putString("string", "string");
edit.commit();
</pre>sp提供对基本数据类型和set集合的保存操作。最后记得commit。<p></p><p>生成的文件格式为xml。路径为:/data/data/<包名>/shared_prefs/sp.xml。具体格式为:</p><p></p><pre name="code" class="html"><?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<float name="float" value="1.0" />
<boolean name="boolean" value="false" />
<string name="string">string</string>
</map>
c.如何获取呢?
sp.getBoolean("boolean", false);
存储的是什么类型,就使用什么类型的方法进行获取。第一个参数为key,第二个参数是当没有获取对应key 的时候,就返回默认值。3.sqlite数据库google将开源的sqlite移植到android系统时,提供了很方便的API。不管使用者是不是SQL高手很能使用,非常人性化。一般我们在使用Sqlite之前,先自己写一个类继承SQLiteOpenHelper。下面介绍一下。
public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}
构造方法:第一个参数:上下文。第二个参数:数据库名称。第三个参数:一般使用系统默认的光标即可。第四个参数:数据库的版本,可用于数据库脚本的升级。onCreate方法:只有在数据库不存在时,第一个创建name为名称的数据库时,才会执行。一旦创建成功,以后都不会执行onCreate方法。onUpgrade方法:数据库版本号大于上个版本号时就会执行该方法,可用于升级。通过以下两个方法就能得到操作数据库的方法了。
helper.getReadableDatabase();
helper.getWritableDatabase();
接下使用不用写具体的sql语句方式进行操作。insert
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", "zhangsan");
db.insert("person", null, cv);
update
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", "aaa");
db.update("person", cv, "id=? or id = ?", new String[]{
"1","2"
});
delete
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("person", "id=? or id=?", new String[]{
"1","2"
});
select
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("person", new String[]{"name"}, "id > ?", new String[]{
"1"
}, null, null, null);

if (cursor.moveToFirst()){
do{
String name = cursor.getColumnName(0);
System.out.println("name:" + name);

<span style="white-space:pre">	</span>	}while(cursor.moveToNext());
}
cursor.close();
查询相对比较复杂一些。返回的是一个光标,通过遍历光标获取数据。如果想通过sql数据进行操作的。是一下方法;执行增删改 db.execSQL(sql)执行查询 db.rawQuery(sql, selectionArgs)4. 关于升级的处理
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
<span style="white-space:pre">	</span>// 我在项目中脚本升级的处理办法为:
<span style="white-space:pre">	</span>// 在工程的assets目录下有一个script.xml文件,里边存储了从第一个版本至最新版本的差异脚本(各个版本之间的差异)
<span style="white-space:pre">	</span>// 在数据库升级时,根据最新的版本和app现有的版本进行逐个升级。如果当前最新的版本5.0,而用户app的版本为2.0,那么就需要
<span style="white-space:pre">	</span>// 读取script.xml中,3.0、4.0、5.0的差异脚本,再此方法执行,这样就解决了跨版本升级的问题,并且维护时,只需要维护当前最新版本
<span style="white-space:pre">	</span>// 和上一个版本之间的差异即可。脚本的维护量在减少。<span style="white-space:pre">	</span>
}
关于数据的持久化保存总结到此为止吧。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: