在Android系统中提供了多种存储技术,下面分别作简要的介绍。
1.最简单的存储方式SharedPreferences
SharedPreferences可以将数据保存在应用软件的私有存储区,具体位置是在/data/data/<package name>/shared_prefs目录中。SharedPreferences处理的是一个个key-value的键值对。使用SharedPreferences保存key-value对的步骤如下:
(1)使用Activity类的getSharedPreferences方法获取SharedPreferences对象。public SharedPreferences getSharedPreferences (String name, int mode);name参数指定了该文件的名称,mode指定该文件的访问权限,同linux下文件的访问权限一样,分别给出文件创建者,文件所有者所在的组中其他用户以及其他用户对文件的访问权限。可以取一下几个值:MODE_WORLD_READABLE(设置其他用户使之拥有读权限),MODE_WORLD_WRITEABLE(设置其他用户使之拥有写权限),MODE_PRIVATE和MODE_APPEND(对其他用户不可访问);几个mode中文件所有者及其所在的组中其他用户默认拥有读写权限。
(2)使用返回的SharedPreferences对象的edit方法获取SharedPreferences.Editor对象。
(3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示value的不同数据类型。例如Boolean类型的value需要使用putBoolean方法保存,String类型的value需要使用putString方法保存。
(4)通过SharedPreferences.Editor接口的commit方法保存key-value对,相当于提交操作。只有调用了该方法后,数据才会真正保存到相应的文件中。
而从SharedPreferences文件中读取key-value键值对的方法类似,只是不需要产生Editor接口,直接使用SharedPreferences的getXxx方法即可。示例代码如下(只给出主要的代码):
private final String PREFERENCE_NAME = "survey"; //文件名称,文件使用默认后缀名为xml,即生成的文件为survey.xml
//保存数据
SharedPreferences mySharedPreferences = getSharedPreferences(
PREFERENCE_NAME, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = mySharedPreferences.edit();
editor.putString("name", "lcd");
editor.putString("habit","basketball" );
editor.putBoolean("employee", true);
editor.putInt("companyTypeId", 12345);
editor.commit();
//读取文件中保存的数据
SharedPreferences sharedPreferences = getSharedPreferences(
PREFERENCE_NAME, Activity.MODE_PRIVATE);
String name=sharedPreferences.getString("name", "");
String habit=sharedPreferences.getString("habit", "");
boolean flag=sharedPreferences.getBoolean("employee", false);
int cmpID=sharedPreferences.getInt("companyTypeId", -1);
也可以通过Activity类的openFileOutput和openFileInput方法获得对应文件的OutputStream和InputStream对象,后使用read或者write方法来读写流(相当于读写文件);而此时文件的存在/data/data/<package name>/files目录下。
2.使用SQLite数据库
android.database.sqlite.SQLiteDatabase是android SDK中操作数据库的核心类之一。为了升级以及使用更方便,我们往往使用SQLiteOpenHelper的子类来完成创建,打开数据库以及各种数据库的操作。SQLiteOpenHelper是一个抽象类,在该类中有如下的两个抽象方法,在其SQLiteOpenHelper子类中必须实现这两个方法:
public abstract void onCreate( SQLiteDatabase db);
public abstract void onUpgrade( SQLiteDatabase db, int oldVersion, int newVersion);
SQLiteOpenHelper类的构造方法如下:public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version);其中name参数表示数据库的文件名,version表示数据库的版本号。
如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用onCreate方法,在该方法中一般需要创建数据库中的表,视图等组件。在创建之前,数据库是空的,因此,不需要先删除数据库中的相关组件。如果数据库文件存在,并且当前的版本号高于上次创建或升级时的版本号,SQLiteOpenHelper会调用onUpgrade方法,调用该方法后,会更新数据库版本号。在onUpgrade方法中,除了创建表,视图等组件之外,还需要首先删除这些相关的组件。创建的数据库文件保存到/data/data/<package name>/databases目录下。下面是一个示例的代码:
package net.blogjava.mobile.db;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBService extends SQLiteOpenHelper
{
private final static int DATABASE_VERSION = 3;
private final static String DATABASE_NAME = "contact.db";
@Override
public void onCreate(SQLiteDatabase db)
{
String sql = "CREATE TABLE [t_contacts] ("
+ "[id] AUTOINC,"
+ "[name] VARCHAR(20) NOT NULL ON CONFLICT FAIL,"
+ "[telephone] VARCHAR(20) NOT NULL ON CONFLICT FAIL,"
+ "[email] VARCHAR(20),"
+ "[photo] BINARY, "
+ "CONSTRAINT [sqlite_autoindex_t_contacts_1] PRIMARY KEY ([id]))";
db.execSQL(sql);
}
public DBService(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
String sql = "drop table if exists [t_contacts]";
db.execSQL(sql);
// 此处应该是新的SQL语句
sql = "CREATE TABLE [t_contacts] ("
+ "[id] AUTOINC,"
+ "[name] VARCHAR(20) NOT NULL ON CONFLICT FAIL,"
+ "[telephone] VARCHAR(20) NOT NULL ON CONFLICT FAIL,"
+ "[email] VARCHAR(20),"
+ "[photo] BINARY, "
+ "CONSTRAINT [sqlite_autoindex_t_contacts_1] PRIMARY KEY ([id]))";
db.execSQL(sql);
}
// 执行insert、update、delete等SQL语句
public void execSQL(String sql, Object[] args)
{
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL(sql, args);
}
// 执行select语句
public Cursor query(String sql, String[] args)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, args);
return cursor;
}
}