目录
Data Storage
Android提供了几个选项为您保存持久应用程序数据。
- Shared Preferences
- Internal Storage
- External Storage
- SQLite Databases
- Network Connection
首选项 Shared Preferences
相关类:SharedPreferences
相关API
- Context.getSharedPreferences(“preference_name”, Context.MODE_PRIVATE);
- Editor editor = sp.edit()
- editor.putString(String key, String value)
- getString(String key, String defValue)
editor1.commit();
**注意:** >Note that when two editors are modifying preferences at the same time, the last one to call commit wins. >If you don't care about the return value and you're using this from your application's main thread, consider using apply() instead ```java SharedPreferences mSp = context.getSharedPreferences(Config.APP_NAME,Context.MODE_PRIVATE); String str = this.mSp.getString(Config.SHARED_PREFERENCES_PARENT_UID, ""); Editor editor = this.mSp.edit(); editor.putString(Config.APP_NAME, ""); editor.commit(); ```
保存位置:
/data/data/[packagename]/shared_prefs/xxxx.xml
注意:一个App中可以存在多个首选项文件
内部存储-internal storage
注意:内部存储不是内存。
**注意:**Shared Preferences和SQLite数据库都是存储在内部存储空间上的。
内部储存指的是什么?
内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。内部存储一般用Context来获取和操作
具体位置
Android提供了一个APIgetFilesDir()来获取你app的内部存储空间,相当于你的应用在内部存储上的根目录。
获取的结果/data/data/yourPackageName/xxx
安卓还为我们提供了一个简便方法 openFileOutput()来读写应用在内部存储空间上的文件,下面是一个向文件中写入文本的例子:
```java
String filename = "myFileName";
String string = "Hello world!";
FileOutputStream outputStream;
try{
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch(Exception e) {
e.printStackTrace();
}
```
这段代码运行完 我们发现在/data/data/yourPackageName/files中多了一个文件myFileName
内部存储API相关操作:
列出所有的已创建的文件,这个可能不容易想到,Context居然有这样的方法
String[] files = Context.fileList(); for(String file : files) { Log.e(TAG, "file is "+ file); }
删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名
if(Context.deleteFile(filename)) { Log.e(TAG, "delete file "+ filename + " sucessfully“); } else { Log.e(TAG, "failed to deletefile " + filename); }
创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径
File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir "+ workDir.getAbsolutePath();
外部存储-external storage
最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储。
所有的安卓设备都有*外部存储*和*内部存储*。
这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了”内部internal” 和”外部external” 两部分,但其实都在手机内部。
所以,不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。
最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
访问外部存储的权限
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。
从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为 com.myjm.beautifycraft的应用,可以自由访问外存上的Android/data/com.example.foo/目录。
外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。
特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。
对于多用户的情况,一般每个用户都会有自己独立的外部存储,应用仅对当前用户的外部存储有访问权限
感谢
如果我的文章有问题请及时联系我,第一时间修改过来