数据不管对于用户还是对于公司都是很重要的,所以数据的存储也是相当的重要。你试想一下,如果一个应用没有做数据存储,那将会何等的可怕?尤其是用户体验极差。
官方文档:https://developer.android.com/guide/topics/data/data-storage?hl=zh-cn
分类
1.sharedPreferences
2.文件存储(可分为内部和外部存储)
3.数据库存储
4.网络存储
而至于网上所说的contentProvider,这是Android提供的一种可将自己的隐私数据暴露出去的方法,而非真正的数据存储方式。
SharedPreferences
这是一种轻量级的存储方案,通常用于存储一些登陆的信息或者开关之类的键值对,它是将键值对保存到xml文件中,一般用于存放一些格式简单且少量的数据。
用法也很简单:
// TODO 存储数据
// SharedPreferences preferences = getPreferences(MODE_PRIVATE);
SharedPreferences sp = getSharedPreferences("sp_file", MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putBoolean("login", true);
edit.putString("login_name", "pioneerz");
edit.apply();
// TODO 获取数据
boolean login = sp.getBoolean("login", false);
String loginName = sp.getString("login_name", "");
注:不建议多进程间使用这种方式共享数据,这是不安全的。
文件存储
文件存储分为内部和外部存储。他的优势在于只要空间足够大,就可以存放大数据,而且也不限制格式。
1.内部存储通常是将数据存储在应用的私有目录下,比如通过openFileOutput打开或创建的文件会放在的应用的/data/data/<package name>/files目录下。这些文件在应用被删除的时候也会跟着删除的,如果有root手机,可以直接通过adb命令去查看:
用法:
public void writeCache(View view) {
try {
File file = new File(getCacheDir(), "cache_test");
FileOutputStream fos = new FileOutputStream(file);
fos.write("write cache".getBytes());
fos.close();
mTextView.setText("写入缓存成功");
} catch (IOException e) {
mTextView.setText("写入缓存失败,原因:"+e.getMessage());
}
}
public void readCache(View view) {
try {
File file = new File(getCacheDir(), "cache_test");
FileInputStream fis = new FileInputStream(file);
int available = fis.available();
byte[] result = new byte[available];
fis.read(result);
fis.close();
mTextView.setText("读取缓存:"+(new String(result)));
} catch (IOException e) {
mTextView.setText("读取缓存失败,原因:"+e.getMessage());
}
}
上面使用cat命令查看文件的内容,得到的也是"Hello world".
2.外部存储通常是将数据存放到内置的sd卡或者外置的sd卡中。这些文件是不会随着应用的删除而删除,所以要注意管理。注意从6.0开始,访问外部存储是需要读写权限的(android.permission.WRITE_EXTERNAL_STORAGE),而且在存储数据之前是需要判断外部存储的状态是否可以可用。
/* Checks if external storage is available for read and write */
public boolean isExternalStorageAvailable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
至于代码就不写了哈!
数据库存储
数据库存储是目前很常见的一种存储,因为他不但可以存储数据,还提供的很方便的数据查询,更新,删除,插入,就是我们通常所说的crud, 也很高效。
使用:
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
其实现在有很多更"好"的数据库的框架,比如greendao,liteOrm等,用起来非常的方便,不像原始的那样的要自己去写命令去crud,他们只是简单的调用相应的函数就行,当然简单的同时是用性能作为牺牲的,而且是用久了,会造成开发者思维的固化,连最基础的sql语句都不太会了,当数据库出现问题,也没能力去排查问题了 。
网络存储
像浏览器中的书签同步和恢复:点击同步的时候,它是将数据打包存放到自己的服务器上的,以防止数据误删或者丢失,当用户点击恢复的时候,它会将服务器上的数据下载下来并显示。