数据存储
2016-01-11 23:42
218 查看
一、 数据存储的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)); |
相关文章推荐
- [每日电路图] 2、红外遥控电路原理设计与解析【转+解读】
- Java学习——继承
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 服务端开发小感
- Android插件化开发之Atlas初体验
- GPUImage滤镜之锐化
- Java final关键字声明的意义
- 说说常用的服务器操作
- 欧几里得扩展算法
- 计算机学习视频教程
- 2016第2周一
- c++中关于char数组/char*指针/string类型 之间的爱恨情
- 了解Java并发集合ConcurrentHashMap
- 序列化详解
- 关于HFile的存储结构梳理以及快速定位rowkey
- Cocos2d-x 3.X 里的回调函数及其参数适配
- Git for windows 中文乱码解决方案
- slf4j的个人学习--转载自http://www.cnblogs.com/xing901022/p/4149524.html
- CCTextureCache类源码分析
- Leetcode: Integer to English Words