- 列表内容
- 数据持久化存储有 文件存储(内置存储,外置存储(sd卡)), SharedPreference , 数据库 , 服务器存储.
使用文件 , SharedPreference 或数据库来保存数据会相对更简单些,而且比起将数据保存在 SD 卡中会更加的安全.
一 : 文件存储
1,将数据存储到文件中
Context 类中提供了一个openFileOutPut()方法,用于将数据存储到指定的文件夹中.
openFileOutPut(name,mode) : 提供了两个参数.
name: 文件的名称,文件创建的时候指定的名称,他所有的文件都是默认存储到/data/data//files/目录下的.
mode: 文件的操作模式.主要有两种模式 :
MODE_PRIVATE : 默认的操作模式,当指定同样的文件名的时候,所写入的内容将会覆盖原文件中的内容.
MPDE_APPEND : 如果该文件存在就往文件里面追加内容,不存在就创建.
其实文件的操作模式本来还有两种: 因为容易引起安全性漏洞,现在已在 Android 4.2 版本中被废弃.
MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE : 允许其他的应用程序对我们程序中的文件进行读写操作.
示例代码:
通过 openFileOutput()方法得到 FileOutputStream 对象,借助 FileOutputStream构建出一个 OutputStreamWriter 对象,接着使用 OutputStreamWriter 构建出一个 BufferedWriter 对象, 借助 BufferedWriter对象来将文本写入到文件中了
String s = getResources().getString(R.string.testData);
try {
data = openFileOutput(“data”, MODE_PRIVATE);
//new OutputStreamWriter(data) 把字符流转换成字节流 ,为了高效 使用bufferedWriter对其进行包装
bufferedWriter = new BufferedWriter(new OutputStreamWriter(data));
bufferedWriter.write(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bufferedWriter!=null)
bufferedWriter.close();//不管操作成不成功,最终一定要关闭流,释放资源
} catch (IOException e) {
e.printStackTrace();
}
}
2 , 从文件 中读取数据
读取数据和存储数据大差不离的.都是 Context 类中提供的另一个 openFileInput() 方法,用于从文件读取数据(但是要知道读取的文件的名称).
openFileInput() 要比 openFileOutput() 简单一些,它只接受一个参数,即要读取的文件名,然后系统会自动到 /data/data//files/目录下去加载这个文件,并返回一个 FileInputStream 对象,得到这个对象之后再通过 java 流的方式就可以将数据读取出来了
示例代码:
/**
* 读取文件
*
* @param fileName 文件名字
* @return 字符串
*/
public String redData(String fileName) {
StringBuilder sb = null;
BufferedReader br = null;
try {
fis = openFileInput(fileName);
br = new BufferedReader(new InputStreamReader(fis));
sb = new StringBuilder();
String line = “”;
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
我们通过 openFileInput() 方法获取到了一个 FileInputStream对象,然后借助 FileInputStream 对象,接着在使用 InputStreamReader 构建出 BufferReader 对象,这样就通过 BufferReader给读取出来,在使用 StringBuilder 对象拼接,最后返回就可以了
- SharedPreferences 存储、
不同与文件的存储方式, sharedPreferences 使用键值对的方式来存储数据的.保存一条数据的时候,需要给这条数据提供一个对应的键,这样读取数据的时候就可以通过键吧相应的值取出来. SharedPreferences 还支持保存多种不同年的数据类型 存储,存储的是什么类型的,取值的时候也要和存储的类型是一样的.
使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象. android 中主要提供了三种方法用于得到 SharedPreferences 对象.Context 类中的 getSharedPreferences() 方法
此方法接受两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个, SharedPreferences 文件都是存放在 /data/data//shared_prefs/目录下的.第二个参数用于指定操作模式,主要有两种模式可以选择, MODE_PRIVATE 和 MODE_MULTI_PROCESS. MODE_PRIVATE 仍然是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个 SharedPreferences 文件进行读写. MODE_MULTI_PROCESS 则一般是用于会有多个进程中对同一个 SharedPreferences 文件进行读写的情况.类似的, MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式在 Android 4.2 版本中废弃.Activity 类中的 getPreferences()
这个方法和 Context 中的 getSharedPreferences() 方法很相似,不过它只接受一个操作模式参数,使用这个方法会自动将当前活动的类名作为 SharedPreferences 的文件名.PreferenceManager 类中的 getDefaultSharedPreferences() 方法
这是一个静态方法, 它就收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件. 得到 SharedPreferences 对象之后,就开始向 SharedPreferences 文件中存储数据了,主要分为三步实现:
1. 调用 SharedPreferences 对象的 edit() 方法来获取一个 SharedPreferences.Editor 对象.
2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用 putBoolean() 方法,添加一个字符串则使用 putString(),…
3.调用 commit() 方法将添加的数据提交,完成数据存储操作
示例代码:
/**
* Created by feng on 2016/3/24.
* 在最好的年华,寻找最真的自己!
* 满天星斗.我继续前进.
*/
public class SharedPreferencesUtils {
private static final String FILE_NAME = “config”;
private static SharedPreferences mSharedPreferences;
private static Context mContext;
private SharedPreferencesUtils() {
this.mContext = new Application().getApplicationContext();
}
/**
* 通过Context获取 SharedPreferences
*
* @param sharedName SharedPreferences 文件的名称
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances(String sharedName) {
if (mSharedPreferences == null) {
mSharedPreferences = mContext.getSharedPreferences(sharedName, Context.MODE_PRIVATE);
}
return mSharedPreferences;
}
/**
* 通过 PreferenceManager 获取 SharedPreferences
* 会以当前的包名作为 SharedPreferences 文件的名称
*
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances() {
if (mSharedPreferences == null) {
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
}
return mSharedPreferences;
}
/**
* 通过 Activity 获取 SharedPreferences
*
* @param mode 文件操作模式
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances(int mode) {
if (mSharedPreferences == null) {
mSharedPreferences = new Activity().getPreferences(mode);
}
return mSharedPreferences;
}
/**
* 存储String类型的数据
*
* @param key 数据的键
* @param value 数据
*/
public static void setString(String key, String value) {
SharedPreferences.Editor edit = getSharedInstances().edit();
edit.putString(key, value);
edit.commit();
}
/**
* 获取Shared 保存的数据
*
* @param key 获取数据的键
* @param dfvalue 默认的值
* @return 数据
*/
public static String getString(String key, String dfvalue) {
return mSharedPreferences.getString(key, dfvalue);
}
/**
* 以此类推
*/
}
4, SQLite数据存储
SQLite 是 轻量级,独立性,隔离性,跨平台,多语言接口,安全性的数据存储.
与 SQLite 数据库相关的类
SQLiteOpenHelper 抽象类 : 通过继承此类,重写父类的方法,来创建和更新表.
SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作
SQLiteCursor查询结构操作类: 用来访问查询结果中的记录 不过要用完要及时关闭
数据库的数据类型都是 String 类型的.
创建数据陆库的创建步骤:
1. 定以一个类继承 SQLiteOpenHelper (数据库帮助类 MyDataBaseOpenHelper )
2. 通过制定数据库文件的名称,数据库的版本号.默认的游标工厂
3.通过 MyDataBaseOpenHelper 对象得到一个可写或者是可读的 数据库.数据库不存在就创建,存在就打开
示例代码:
/**
* @param context 上下文
* @param name 数据库名称 以 .db 结尾
* @param factory 默认游标工厂 从数据库文件的头部开始
* @param version 数据库的版本号 最小是1
*/
public MyDataBaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table book(_id integer primary key autoincrement,author text ,price real, pagers integer,name text)”);
db.execSQL(“create table Category(_id integer primary key autoincrement,category_name text,category_code integer)”);
Log.i(TAG, “onCreate: 数据库创建了”);
}
/**
* 更新数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(“drop table if exists book”);
db.execSQL(“drop table if exists Category”);
onCreate(db);
}
MyDataBaseOpenHelper myDataBaseOpenHelper = new MyDataBaseOpenHelper(this,”book.db”,null,2);
SQLiteDatabase writableDatabase = myDataBaseOpenHelper.getWritableDatabase();//这句话执行了数据才创建成功
5.服务器存储
未完待续!