android应用程序数据持久化

所谓持久化是为了将数据保存起来,程序退出或者是手机关机以后,再次运行程序,能获取到上次运行的数据。目前数据持久化保存的方式有三种。

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>

}		

		
关于数据的持久化保存总结到此为止吧。





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值