Android移动存储方案

    在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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值