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 (暂时不说以后补)