数据存储
来源:互联网 发布:长城三公主知乎 编辑:程序博客网 时间:2024/05/01 08:54
一、 数据存储的5种方式
使用API Guide学习数据存储的五种方式。
1、 Shared Preferences : 使用键值对的形式去存储私有数据,这种数据只有当前应用可以访问,其他应用无法访问。(数据是以xml的形式存放在data/data/应用程序包名/….)
2、 Internal Storage :其实是以文件的方式,把数据存储到内部存储器上。
3、 External Storage : 其实是以文件的方式把数据存储在外部存储器上。
4、 SQLite Databases : 把数据存储在私有的数据库文件内
5、 Network Connection :把数据存储到远端网络上的服务器上。
【备注:】
· 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。
· 所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
· getFilesDir()获取你app的内部存储空间,相当于你的应用在内部存储上的根目录。
· 最容易混淆的是外部存储,如果说pc上区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的SDCard卡是外部存储。比如Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储
一、 SharedPreferences存储
SharedPreferences是Android系统提供的一个通用的数据持久化框架,用于存储和读取key-value类型的原始基本数据类型对,目前支持string、int、long、float、boolean等基本类型的存储,对于自定义的对象数据类型,无法使用SharedPreferences来存储。
SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名,上次最后设置的配置信息(如:是否打开音效、是否使用振动,小游戏的玩家积分等)。当再次启动程序后依然保持原有设置。SharedPreferences用键值对方式存储,方便写入和读取。
写数据步骤:
1、根据Context获取SharedPreferences对象
SharedPreferences sp = ctx.getSharedPreferences("user", MODE_PRIVATE);
说明:参数一:文件名(不需要扩展名,会自动使用xml作为扩展名) 参数二:文件的访问模式。共四种:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768(SharedPreferences不支持)
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
(最后两种模式,从4.2开始android已经不推荐使用了!!!)
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
MODE_MULTI_PROCESS :这个是一个标示位,2.3和2.3以前默认都是开启的,2.3以后是默认不开启。主要用于跨进程访问。
2、利用edit()方法获取Editor对象。
SharedPreferences.Editor editor = settings.edit();
获得一个编辑器,使用这个编辑可以向文件中写入数据
3、通过Editor对象存储key-value键值对数据。
editor.putString(“name”,”lisi”);
editor.putString(“sex”,”男”);
存入数据,可以写字符串、int、long、float、boolean和Set<String>
4、调用Editor对象的commit()方法提交数据。
必须调用该方法,否上述数据不会存入到文件中。
读数据步骤:
1、 根据Context获取SharedPreferences对象
调用SharedPreferences的getXxx(key, defaultValue)方法,取得相应 key对应的值。
二、 内部存储
内部存储路径是: /data/data/app包名/files
注意:真机若想看到此目录,必须root之后,安装相应的文件浏览器才可以看到,模拟器无此限制。
在Activity内部调用:
1、 openFileInput(不需要路径的文件名) //打开一个输入流,可以从指定的文件中读取数据
openFileOutput(不需要路径的文件名, mode) //打开一个输出流,可以向输入流写数据,然后数据保存到指定的文件中。
三、 外部存储
泛指sd卡,但是目前的很多手机读不支持外置sd卡,平时手机说的16g 32g等也是指的sd卡,只不过厂家内置,不再支持扩展而已。
读写sd上的文件请按如下步骤进行:
1、 给app申请需要的权限。(尽量多申请)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
允许向sd写数据的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
允许挂载和卸载sd
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
允许读sd数据的权限。(这个权限默认是开启的,但是建议仍然申请,以备后患)
2、 调用Enviroment的getExternalStorageState()方法来判断手机是否插入SD卡。
String state = Environment.getExternalStorageState();
// 如果sd卡存在,并且正常挂载(分区从属目录),可读写
if(state.equals(Environment.MEDIA_MOUNTED)){
}
3、 调用Environment的Environment.getExternalStorageDirectory();获得外部存储器的sd卡的目录。
返回值类型是File类型。
4、 创建相应的IO流进行数据的读写。
补充:
1、 获得外部存储的公共目录:Envirment.getExternalStoragePublicDirectory(参数) DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES, or others.
2、 获得外部该app的私有存储目录:context.getExternalFilesDir(type) ; type可以指定类型,然后会在相应的类型。如果不指定相应的类型,则获得路径是:Android/data /包名/files
DIRECTORY_ALARMS //警报的铃声
DIRECTORY_DCIM //相机拍摄的图片和视频保存的位置
DIRECTORY_DOWNLOADS //下载文件保存的位置
DIRECTORY_MOVIES //电影保存的位置, 比如 通过google play下载的电影
DIRECTORY_MUSIC //音乐保存的位置
DIRECTORY_NOTIFICATIONS //通知音保存的位置
DIRECTORY_PICTURES //下载的图片保存的位置
DIRECTORY_PODCASTS //用于保存podcast(博客)的音频文件
DIRECTORY_RINGTONES //保存铃声的位置
3、 获取磁盘空间大小:
File root = Environment.getExternalStorageDirectory(); //获得外部存储目录
StatFs Fs = new StatFs(root.getAbsolutePath()); //该对象可以 获取指定目录的文件系统的信息
le total = statFs.getTotalBytes() / 1024.0 / 1024.0; //获取总的大小
le current = statFs.getAvailableBytes() / 1024.0/ 1024.0; //获取可用大小
Toast.makeText(this, "" + total + " " + current, 1).show();
注意:获取路径的时候,公共的一般是用的Environment的方法,app私有的一般是使用的上下文对象的方法。
android中常用路径总结:
1、公共路径:所有的app都可以访问
System.out.println(Environment.getDataDirectory()); // /data
System.out.println(Environment.getDownloadCacheDirectory()); // /cache
System.out.println(Environment.getExternalStorageDirectory()); // /storage/sdcard
System.out.println(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)); // /strorage/sdcard/Alarms
System.out.println(Environment.getRootDirectory()); // /system
2、私有路径:只有当前应用可以访问
System.out.println(getFilesDir()); // /data/data/包名/files
System.out.println(getCacheDir()); // /data/data/包名/cache
System.out.println(getExternalCacheDir()); // /storage/sdcard/Android/data/包名/cache
// /storage/sdcard/Android/data/包名/files/DCIM
System.out.println(getExternalFilesDir(Environment.DIRECTORY_DCIM));
- 数据存储
- 数据存储
- 数据存储
- 存储数据
- 存储数据
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- HP-UX+11.2.0.3RAC因裸设备权限不一致导致RAC一个节点报错的解决
- css3线性渐变
- hdu 2079 选课时间 DP动态规划 母函数 穷举 寒假集训1 07
- 服务端开发小感
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 数据存储
- 网络舆情分析师
- HDU【1875】畅通工程再续
- mark一下:csdn博客访问量约100万, 积分约2万, 评论约1000条, 排名约200
- 一、排序(时间复杂度 O(n^2))
- StarUML2 建模工具全平台破解及license验证简要分析
- dcm4che2.0.29版本 ----- DicomImageReadParam
- 资源收集
- 进程控制-创建子进程