SharedPreferences,内部存储,外部存储,sqlite,ContentProvider,网络,都可以作为android数据存储的方式,本文只简单了解前面四种
1.SharedPreferences:
SharedPreferences以键值对的形式储存数据,只能储存int,long,float,boolean,string类型的值,具体使用:
//1.存储数据
//获取指定名字的SharedPreferences对象(getSharedPreferences是Context类的函数),第二个参数传0即可
SharedPreferences sp = getSharedPreferences(“name”, 0);
//获取相应的Editor对象,edit()会在检测是否有名为“name”(上面传的)的文件,如果没有则在内存中创建name.xml文件
SharedPreferences.Editor editor = sp.edit();
//存放bool值
editor.putBoolean("booleankey", true);
//存放int值
editor.putInt("stringkey", “str”);
//移除某个值
editor.remove("key");
//只有调了commit函数上面的操作才会生效
editor.commit()
//2.访问数据
//获取指定名字的SharedPreferences对象,第二个参数传0即可
SharedPreferences sp = getSharedPreferences(“name”, 0);
//获取boolean类型值,false为默认值,如果booleankey所对应的值不是boolean类型值,抛ClassCastException下同
sp.getBoolean("booleankey",false)
//获取boolean类型值
sp.getInt("booleankey",5)
2.内部存储
一般情况下情况下内部存储是应用程序私有的,不允许其他应用或用户访问。其根路径是/data/data/[应用包名]/,具体使用:
获取文件输入输出流,当指定名字的文件不存在时会创建
FileOutputStream fos = openFileOutput(String name, int mode);
FileInputStream fis = openFileInput(String name, int mode);
其中第二个参数可以是下面几个值的的
Context.MODE_WORLD_WRITEABLE :允许其他程序写入该文件
Context.MODE_PRIVATE : 只允许本程序访问
Context.MODE_WORLD_READABLE : 允许其他程序读取该文件
但是从android17开始MODE_WORLD_WRITEABLE和MODE_WORLD_READABLE已经弃用,而且在android N以后的版本使用会报错
Context还包括了其他几个有关内部文件操作的函数
Flie getCacheDir() 返回内部文件系统缓存目录。
File getFilesDir() 返回内部文件系统目录。
File getDir(String name, int mode) 在内部存储空间内创建(或打开现有的)目录。
deleteFile(String name) 删除保存在内部存储的文件。
String[] fileList() 返回应用当前保存的一系列文件。
3.外部存储(以下介绍不考虑7.0及以上的访问特定目录)
一般情况下情况下外部存储允许其他应用或用户访问
1).外部存储需要在清单文件中添加访问权限
<manifest ...>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
其中WRITE_EXTERNAL_STORAGE是包含READ_EXTERNAL_STORAGE的
2).检测外部存储状态
/* 检测外部存储是否可读可写 */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* 检测外部存储是否可读 */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
Environment.getExternalStorageState() 返回外部存储的状态。Environment预定了一些状态常量
3).外部存储常用函数
//获取下载缓存目录
Environment.getDownloadCacheDirectory();
//获取系统目录,路径为/system,该目录是只读的
Environment.getRootDirectory();
//Context类的方法,Context类的非静态方法返回的一般都是应用程序私用的,当其他应用和用户依然可以访问到
//返回外部存储某个私有目录,跟getExternalStoragePublicDirectory的区别在与于getExternalFilesDir储存的文件系统的媒体程序扫描是不会关联上,但是两者的文件其他应用和用户都是可以访问的
getExternalFilesDir(Environment.DIRECTORY_MUSIC);
//返回外部存储私有缓存目录,其他应用和用户都是可以访问的
getExternalCacheDir();
4.SQlite
SQlite是android内置的一个小型的数据库,操作的语句和其他数据库大同小异。使用步骤:
1.继承SQLiteOpenHelper
2.通过getReadableDatabase()或getWritableDatabase()获取SQLiteDatabase对象,两个行数返回的是同一个对象,只是设置了不同权限
3.利用query(),execSQL()操作数据库,其中execSQL()用于执行无法回sql语句(如创建表,插入等),query()用于查询,放回Cursor对象
4.SQLiteDatabase.close关闭数据库
public class MyOpenHelper extends SQLiteOpenHelper {
private static final String CREATE_TABLE = "create table TableName(name1 text,name2 text);";
/**
*
* @param context 上下文
* @param name 数据库名称
* @param factory Cursor工厂类,用于创建Cursor,传null使用默认工厂类
* @param version 数据库版本号,传入的值只能大于等于当前值,初始为1
*/
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
//第一次调用getReadableDatabase()或getWritableDatabase()时会回调该方法,在该方法中可以做一些数据库的初始化工作,如创建表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库版本号升级时回调
}
}