android下数据的持久化保存

  1. 列表内容
  2. 数据持久化存储有 文件存储(内置存储,外置存储(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 对象.

    1. 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 版本中废弃.

    2. Activity 类中的 getPreferences()
      这个方法和 Context 中的 getSharedPreferences() 方法很相似,不过它只接受一个操作模式参数,使用这个方法会自动将当前活动的类名作为 SharedPreferences 的文件名.

    3. 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.服务器存储
未完待续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值