Android 数据存储与共享

首先对文件权限做一下说明:

–在Linux系统中,文件权限描述符每3个字符分别描述了 创建者(第1-3字符)、同组用户(第4-6字符)和 其他用户(第7-9字符)对文件的操作限制(权限);
–每字符意义:x表示可执行,r表示可读,w表示可写,d 表示目录,-表示普通文件(无操作权限)。
–例如:“-rw-rw-rw”表示SaveSetting.xml可以被创建 者、同组用户和其他用户进行读取和写入操作,但不可 执行.


1、SharedPreferences

轻量级NVP(name-value pair)方式存储,以XML的文件方式保存,完全屏蔽对文件系统的操作过程。

一般用于自动登陆,记录上一次用户离开时用户设置等。

开发人员仅仅是通过调用SharedPreferences的API对NVP进行保护和读取。

除了数据保存,还提提供数据共享功能

主要支持三种数据访问模式(读写权限)

a、MODE_PRIVATE 仅创建程序可以读写

b、MODE_WORLD_READABLE 创建程序可读写,其他程序可读不可写

c、MODE_WORLD_WRITEABLE 创建程序可读写,其他程序可写不可读

其中,后面两种模式是可以组合的,用+ 或者 |

使用方法:

第一步:定义访问模式(选择一种):

public static int mode=MODE_PRIVATE;
public static int mode=MODE_WORLD_READABLE;
public static int mode=MODE_WORLD_WRITEABLE;
public static int mode=MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE;

第二步:定义SharedPreferences的名称:

public static final String PreferencesName="SaveSettings"

第三步:创建SharedPreferences对象

SharedPreferences sharePrefercences=getSharedPrefernces(PreferencesName,mode);

第四步:修改与保存

SharedPreferences.Editor editor = sharedPreferences.edit(); 
editor.putString("Name", "Tom"); 
editor.putInt("Age", 20); 
editor.putFloat("Height", (float)163.00 ); 
editor.commit();

第五步:读取数据

SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE); 
String name = sharedPreferences.getString("Name","Default Name"); 
int age = sharedPreferences.getInt("Age", 20);
sharedPreferences.getInt("Age", 20);//第二个参数代表若取不到,则默认值为20




SharedPreferences文件就保存 在 

/data/data/<package name>/shared_prefs/ 

目录下,其中的就是我们的数据文件。


下面说一下SharedPreferences怎么进行数据共享:

首先必须要满足三个条件:

• 共享者需要将SharedPreferences的访问模式设置为全局读或 全局写
• 访问者需要知道共享者的包名称和SharedPreferences的名称, 以通过Context获得SharedPreferences对象

• 访问者需要确切知道每个数据的名称和数据类型,用以正确 读取数据

主要步骤:
(新)定义要访问的应用的名称
第1-2步:定义模式、名称
(新)创建要访问的应用的上下文
第3步:得到上下文的SP
第5步:读NVP


示例代码:

public static final String PREFERENCE_PACKAGE = "edu.hrbeu.SimplePreferenceDemo";
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE; 
public static final String PREFERENCE_NAME = "SaveSetting";
public void onCreate(Bundle savedInstanceState) { 
	Context c = null; 
	try { // 获取 SimplePreferenceDemo 
		Context c = this.createPackageContext(PREFERENCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY); //第二个参数代表忽略一些安全问题
	} catch (NameNotFoundException e) {
			e.printStackTrace();
		} // 将正确的 SharedPreferences 名称传递给函数 
	
	SharedPreferences sharedPreferences = c.getSharedPreferences( PREFERENCE_NAME, MODE ); // 读取 NVP 
	String name = sharedPreferences.getString("Name","Tom"); 
	int age = sharedPreferences.getInt("Age", 20); 
	float height = sharedPreferences.getFloat("Height",);



2、文件存储

• Android使用的是基于Linux的文件系统
• 程序开发人员可以建立和访问程序自身的私有文件
• 也可以访问保存在资源(res)目录中的原始文件和XML文 件

• 还可以在SD卡等外部存储设备中保存与读取文件

• Android系统允许应用程序创建仅能够自身访问的私有 文件,文件保存在设备的内部存储器上,在Linux系统 下的/data/data/<package name>/files目录中
• Android系统不仅支持标准Java的IO类和方法,还提供 了能够简化读写流式文件过程的函数

• 主要介绍两个函数 

    • openFileOutput() 

    • openFileInput()



3、数据库存储 SQLite 数据库

特点:

• 更加适用于嵌入式系统,嵌入到使用它的应用程序 中 

• 占用非常少,运行高效可靠,可移植性好 

• 提供了零配置(zero-configuration)运行模式

• 这些数据库和其中的数据是应用程序所私有的

• 不应该用其来存储文件


• 如果要将其同其他应用程序共享,则必须把应用程序变 为一个ContentProvider(后面将讲到


使用SQLite数据库:

第一步:使用应用程序上下文创建SQLite数据库

首先创建的类需要包含SQLiteOpenHelper

public class MemberDAO extends SQLiteOpenHelper { 
	private static final String DB_NAME = "member.db"; 
	private static final int DB_VRESION = 1; 
	private static final String TABLE_NAME = "member"; 
	private static final String SQL_CREATE_TABLE = "create table " + TABLE_NAME + 
	" (_id integer primary key autoincrement," + 
	" name text not null, info text);";
	public MemberDAO(Context c) { // 创建数据库访问对象 它实际上没有创建数据库,马上返回。 只有调用getWritableDatabase() 或 getReadableDatabase() 时才会创建数据库 
	//数据库文件位于 /data/data/< 包名 >/databases
		super(c, DB_NAME, null, DB_VRESION);
	}
	//第一次调用getWritableDatabase() 或 getReadableDatabase() 时 调用
	@Override public void onCreate(SQLiteDatabase db) { // 创建数据库表 
		db.execSQL(SQL_CREATE_TABLE); 
	}
	//DB_VRESION 变化时调用此 函数
	@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 更新数据库版本(这里不使用) 
	// db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
	// onCreate(db); 
	}
	
}

第二步:

在需要进行数据库操作的文件当中

SQLiteDatabase db = getReadableDatabase(); 

然后可以调用insert,等函数进行数据库操作


说明一下数据库的查询操作:


4、ContentProvider (暂时不说以后补)