Android的数据保存可以分为3种情况
两种方法:
getSharedPerference() 多个shared perference文件
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE);
getPerference() 当activity只需要一个sp文件的时候,此时不需要文件名
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), default); // default 是作为查找的key不存在的时候的返回值
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit(); //注意:最后要commit()
也就是保存在Flie systen,通过 Flie 的读写Apis
而android中有两个文本存储区域,这是因为android大都有两个存储位置,一个是不可变的 *internal storage,而另外一部分是可拆卸的 external storage (虽然现在有一些的设备将 internal 和external都做成了不可拆卸),但是还是有逻辑区分的
以下是总结的internal和external的区别的联系
位置 | 可用性 | 访问性 | 卸载后 | 权限 |
---|---|---|---|---|
internal | 总是可用的 | 只能被自己的app访问 | 系统会清理app内所有的相关文件 | 无需权限 |
external | 并不总是可用的(可能是外部sd卡) | 可以被其他的app访问到 | 卸载后只删除external根目录下的相关文件? | 要在mainfest里声明读写权限 |
// 这是在目录下创建一个文件
File file = new File(context.getFilesDir(), filename);
//这是通过outputstream写入
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
//最后这个很重要,是如何缓存文件的,其实绝大多多数情况下我们都要用到缓存的,视频缓存,图片缓存等
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
因为其可用性不一定,所以保存文件前一定要先进行可用性测试
//测试是否可读写
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
存储为 public flie 卸载时不可删除
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory( //要通过这个方法获取file
Environment.DIRECTORY_PICTURES), albumName); //要制定类型
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
private file 在app卸载时刻删除
public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = new File(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName); //这里指定类型很重要,如果指定的不是picture而是miuce,那么久不会被视为picture对待
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
如果没有足够空间就会发生 IOException,如果实现要知道 getFreeSpace() or getTotalSpace() 来判断是否有足够的空间来保存文件,返回的是可用空间大小,但是一般需要更多一些
myFile.delete(); //删除文件
myContext.deleteFile(fileName);//删除internal中的文件
Tips:
卸载时会删除
internal所有
external中的 private file
但是缓存中的文件一般需要手动删除
因为本人并不是很熟悉 SQL,所以等了解了SQL后再回来看这部分