android preference:
在android中,最简单的持久化数据的办法是使用Preferences API,获取preference对象有三种方式,都是通过Activity对象的方法,获取的是android.content.SharedPreferences对象实例。
getPreferences():获取到作用域是本Activity的preference
public SharedPreferences getPreferences (int mode)
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的
名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
此方法存储的数据只有本activity可以访问到。
getSharedPreferences():获取到作用域是本应用程序的preference
public SharedPreferences getSharedPreferences (String name, int mode)
通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。
此方法存储的数据本程序的所有activity都可以访问到。
示例:
以下示例让SharedPreferences保存用户选择的值:
涉及获取和保持preference值的代码在Actvity的onCreate方法代码中:
preferences =this.getSharedPreferences(“sms.service.easymorse.com”, 0);
isStart =preferences.getBoolean(“sms.service.is.start”, false);
RadioGroup radioGroup = (RadioGroup) this
.findViewById(R.id.radioGroup01);
if (isStart) {
radioGroup.check(R.id.radioButtonStart);
} else {
radioGroup.check(R.id.radioButtonStop);
}
radioGroup.setOnCheckedChangeListener(newOnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroupgroup, int checkedId) {
if (checkedId ==R.id.radioButtonStart) {
isStart = true;
Log.v(“sms.service”,“>>start service…”);
} else {
isStart = false;
Log.v(“sms.service”,“>>stop service…”);
}
preferences.edit().putBoolean(“sms.service.is.start”, isStart).commit();
}
});
SharedPreferences实例是通过:
get方法获取对应键的值;
edit方法获取SharedPreferences.Editor对象
通过SharedPreferences.Editor的put方法写入键值对
保存需要commit方法
getDefaultSharedPreferences():每个应用有一个默认的偏好文件preferences.xml,使用getDefaultSharedPreferences获取
getDefaultSharedPreferences和getSharedPreferences区别:
自定义的一些偏好设置用getSharedPreferences来获取,例如定义一个loginpref.xml的偏好文件
使用
SharedPreferences sharedPreferences = getSharedPreferences("loginpref", Context.MODE_PRIVATE);
System.out.println("set_location = "+sharedPreferences.getBoolean("islogin", false));
Editor editor = sharedPreferences.edit();
editor.putBoolean("islogin", false);
editor.commit();
来获取或者更改
每个应用有一个默认的偏好文件preferences.xml,使用getDefaultSharedPreferences获取
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
System.out.println("set_location = "+preferences.getoolean("if_set_location", false));
Editor editor = preferences.edit();
editor.putBoolean("if_set_location", false);
editor.commit();
"if_set_location"可能对应的是CheckBoxPreference或者其它,但是通用get***来获取值
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="位置信息设置">
<CheckBoxPreference
android:key="set_location"
android:title="打开或关闭位置信息"
android:summary="更改您的位置设置,打开或者关闭位置共享"
android:defaultValue="true"
/>
<Preference
android:key="set_sys_location"
android:title="系统位置功能设置"
android:summary="点击到系统设置页面打开或关闭GPS位置功能"
/>
</PreferenceCategory>
</PreferenceScreen>
-----------------------------------------------------------------------
数据库:
写一个类继承自SQLiteOpenHelper,在该类中有如下两个抽象方法,
SQLiteOpenHelper的子类必须实现这两个方法。
public abstract void onCreate(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db,intoldVersion,int newVersion);
SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在,会打开这个数据库,在这种情况下就不会调用onCreate()方法。如果数据库文件不存在,SQLiteOpenHelper首先会创建一个数据库文件,然后打开这个数据库,最后调用onCreate()方法。因此,onCreate()方法一般用来在新创建的数据库中建立表、视图等数据库组建。也就是说oncreate()方法在数据库文件第一次创建时调用。
先看看SQLiteOpenHelper类的构造方法再解释onUpdate()方法何时会被调用。
public SQLiteOpenHelper(Context context,Stringname,CursorFactoryfactory,intversion);
其中name参数表示数据库文件名(不包括文件路径),SQLiteOpenHelper会根据这个文件名创建数据库文件。version表示数据库的版本号。如果当前传入的数据库版本号比上次创建或升级的版本号高,SQLiteOpenHelper就会调用onUpdate()方法。也就是说,当数据库第一次创建时会有一个初始的版本号。当需要对数据库中的表、视图等组建升级时可以增大版本号,再重新创建它们。
现在总结一下oncreate()和onUpgrade ()调用过程。
1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。
2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onUpgrade ()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。
综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onUpgrade ()方法升级数据库,并更新版本号。
调用SQLiteOpenHelper派生类对象的getWritableDatabase或getReadableDatabase
方法获得SQLiteDatabase 对象,然后使用SQLiteDatabase对象执行查询,插入等语句。
调用SQLiteOpenHelper派生类对象的close方法关闭数据库连接
也可以不用SQLiteOpenHelper,直接创建或打开数据库:
- SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
- db.execSQL(......)