惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Y
Y Combinator Blog
T
Tailwind CSS Blog
G
Google Developers Blog
博客园 - Franky
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
爱范儿
爱范儿
博客园 - 【当耐特】
腾讯CDC
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - gcg0036

亚信仨月印象(国庆时再写) 博客搬家了! log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable. 模板引擎Crox用法大全(更新版) Apache Tomcat Maven Plugin 参数大全(Tomcat 6) Apache Tomcat Maven Plugin MyEclipse 2015 CI 12 无限试用 sshe源码分析——权限管理的后台部分 sshe源码分析——全局架构 无聊的三月终于过去了 failed to initialize monitor thread 在Android项目中的测试类点击"run as JUnit test"出错 Interacting with Other Apps Managing the Activity Lifecycle Adding the Action Bar Building Your First App The AndroidManifest.xml File handlebars简单用法 高性能跨语言模板引擎Crox
Saving Data
gcg0036 · 2015-03-08 · via 博客园 - gcg0036

http://www.cnblogs.com/gcg0036/p/4321278.html

Saving Key-Value Sets:

如果想保存一个相对较小的key-values集合,可以使用 SharedPreferences API. SharedPreferences对象指向包含key-value对的文件,并且提供简单的读写方式。每个SharedPreferences文件均由框架管理,私人或共享均可使用。

可以保存任何简单类型的数据:boolean、float、int、long 和 string 。 这些数据是持久保存的,可以跨越用户会话(即使应用程序被杀死了也没关系)。

您可以创建新的共享首选项文件,或者采取两种方式之一来调用现有文件。

  1. getSharedPreferences() 如果需要用到多个配置文件,就用这个方法,第一个参数指定了文件的名称。你可以从应用程序的任何 Context调用这一函数。
  2. getPreferences() 如果只需为 Activity 定义一个配置文件,就用本方法。。因为该文件对于 Activity 而言是唯一的,所以不需要命名。
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

读取,可以使用getInt() 、 getString()等调用方法来提供你想要的关键值,当键不存在时会返回某个默认值

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

写入,需要调用SharedPreferences上的edit()来创建SharedPreferences.Editor,然后调用commit()来保存

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

Saving Files

File 对象适用于在start-to-finish读取或写入大量数据,File对象适合于读取或者写入大量数据

内部存储:
  • 始终可用。
  • 保存的文件只能用于默认应用程序。
  • 当用户卸载应用程序时,系统会从内部存储删除应用程序所有文件。
当要确保无论用户还是其他应用程序均可访问文件时,内部存储无疑是最好的选择。
外部存储
  • 由于用户可以安装外部存储作为USB存储,并且在某些情况下可以从设备中移除,所以外部存储并不总是可用的。
  • 具有全局可读性,所以保存的文件可能被控制范围外的人读取。
  • 用户想要卸载应用程序,只有当 应用程序文件保存在getExternalFilesDir()目录时系统才会删除应用程序文件。
对于不需要访问限制的文件以及要同其他应用程序共享或者允许用户使用计算机访问的文件,外部存储无疑是最好的途径。

要写入外部存储,就必须在 manifest file中请求 WRITE_EXTERNAL_STORAGE的权限。

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

内部存储文件不需要任何权限。应用程序始终有权在其内部存储目录读取及写入文件。

注意: 自 Android 4.4 开始,如果只是读写应用程序私有的文件,则不再需要申请上述权限了。

在内部存储保存文件

getFilesDir() 返回表示应用程序内部目录的文件
getCacheDir() 返回表示应用程序临时缓存文件的内部目录的文件。一旦不再需要要确保删除每个文件。确保删除不再需要的文件并且设置合理大小的内存总量,比如1MB。如果系统存储开始运行缓慢,它可能会不经警告而删除缓存文件。
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();
}

如果需要缓存文件,就应该使用createTempFile()。例如从URL中提取文件名并且在应用程序内部缓存目录创建文件,方法如下:

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

在外部存储保存文件

/* Checks if external storage is available for read and write */
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 File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory. 
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}
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);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

使用API常量比如DIRECTORY_PICTURES提供的目录名称是很重要的。这些目录名称确保系统可以适当处理文件。例如保存在 DIRECTORY_RINGTONES的文件由系统媒体扫描来进行铃声分类而不是音乐分类.

getFreeSpace() 和 getTotalSpace()可以找出是否有足够的可用空间

删除文件可以是delete()。deleteFile()来请求Context定位和删除文件

注意:用户卸载应用程序时,安卓系统会删除以下内容:
  • 内部存储的所有文件。
  • 使用 getExternalFilesDir()外部存储的所有文件。
然而你要手动删除getCacheDir() 定期创建的所有缓存文件,同时定期删除其他不需要的文件。

Saving Data in SQL Databases:

http://wiki.eoeandroid.com/Saving_Data_in_SQL_Databases