Android学习--《数据的保存》

概述

Android的数据保存可以分为3种情况

  1. 保存在preference (小的键值对集合)
  2. 保存在文件 (流式顺序数据,如图片文件,网络交换的数据等)
  3. 保存到数据库DB

保存在Perference

两种方法:

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);

读写 Perference

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里声明读写权限

internal 存储

// 这是在目录下创建一个文件
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;
}

external 存储

因为其可用性不一定,所以保存文件前一定要先进行可用性测试


//测试是否可读写
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后再回来看这部分

你可能感兴趣的:(android)