服务端的数据存储
1) MySql (Oracle,DB2,Sybase,SQLServer,...,NoSQL(Hbase,mongoDB))
2) File (例如配置文件,xml,properties)
客户端的数据存储
1)外部存储(外置SDCARD存储)8个方法
a)目录,大小,状态,特点
b)对象(Environment,Context,StatFs)
2)内部存储8个方法
a) 直接存储 (目录,OpenFileInput,OpenFileOutput)
b) 偏好设置 (SharedPreferences,Editor)
c) SQLite存储(SQLiteDatabase,SQLiteOpenHelper)
3)静态读取
a)assets
b)res/raw
c)res/xml
简单的配置数据用sp偏好设置
结构化的数据使用自带的sqlite数据库
音乐、图片等文件使用内外部存储空间存储文件
联系人 短信等使用ContentProvider进行数据增删改查的操作
重要的业务数据存储在网络服务器
文件存储
内部存储器 和app共生死
外部存储器 所有app的公共绿地中带有自留地(4.4 19以后)
内部存储 8个方法
所谓内置sdcard一般指的是系统(linux)默认所在存储空间.
内部存储的数据为应用程序的私有数据(存储在应用程序的私有目录中)在应用卸载时会被一起删除
不用加读写权限 指的是系统内置sdcard中数据的存储(即系统所在的目录)
我们安装一个apk文件时都默认安装在内置存储空间中,当内部存储空间不足时,可以选择外部存储空间
我们在内部存储空间中的数据,应用程序卸载时,此空间的数据也会一同删除
我们不建议在内部存储空间放置大量数据,此空间内容多了可能会影响系统整体运行性能。
================================================
/data/data/应用包名
方法都是Context类的,所以Activity具有强大的资源访问能力(内部、外部存储都可以)
context.getDir(String name, int mode)
按照指定名称来创建或打开已存在的内部存储目录以File对象返回
/data/data/app包名/app_文件名
在此目录可以创建任意文件、子目录 访问权限针对整个目录而不能针对单个文件
context.getFilesDir() 创建或打开已存在的内部存储目录以File对象返回
/data/data/app包名/files
context.openFileInput(String name) 创建或打开已存在的内部存储的文件字节输入流
context.openFileOutput(String name, int mode)创建或打开已存在的内部存储的文件字节输出流
/data/data/app包名/files/目录中
name是文件名称,不能用文件分隔符“/”,如果文件不存在会自动创建它
mode操作模式:
MODE_PRIVATE 默认私有模式 表示该文件只能被该应用程序访问 写入文件会覆盖原来内容
MODE_APPEND 私有 在原有内容上增加数据
MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 允许其他app读写 在17已废弃
context.getFileStreamPath(String name)
/data/data/app包名/files/文件名 获得表示 files 目录中一个指定文件的 File 对象
context.deleteFile(String name)
/data/data/app包名/files/文件名 删除文件
context.fileList()
/data/data/app包名/files/ 获得文件列表,返回文件名 String[] 数组
context.getCacheDir() 创建或打开已存在的内部存储的缓存文件以File对象返回
/data/data/app包名/cache/
存储空间紧张时,系统会自动删除该目录中的文件
你应该严格限制此目录总大小(例如1M),超出限制时应对文件做清理
context.getDatabasePath("数据库文件名.db") 只返回路径,不存在也不会创建
参数为数据库文件名称:如"stu.db" 返回一个数据库文件("stu.db")所在的文件路径,
但是不确定该文件("stu.db")是否存在,没有创建目录的功能
偏好设置 SharedPreferences
SQLite存储
外部存储8个方法 写外置sdcard 1看空间 2加权限
所有兼容android的设备都支持一个可共享的外部存储external storage
用来存储文件 可以是一个可移动的sd卡 或者一个内部的不可移动的存储
保存在外部存储的文件是可读的 并且可以通过usb在电脑上修改他们
获取外部存储的权限:
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE 是包含读权限的
4.4中外部存储也可以私有化数据于app共生死 且是可以不申请权限的
================================================
一般指外置sdcard的存储,外置sdcard中通常存储的是一些比较大的文件
音频文件、视频文件、图片、文档
外部存储状态的获取、目录的分析和IO操作
外部存储的数据的特点:数据允许被多个应用程序共享数据 也允许设置为应用程序私有
Environment.getExternalStorageState() 获得sdcard的存储状态
获得当前sdcard存储卡状态代码(外设状态),Environment.常量
MEDIA_BAD_REMOVAL 正确卸载前已经拔卡
MEDIA_CHECKING 正在检测
MEDIA_MOUNTED 正确装载,已准备好读写
MEDIA_MOUNTED_READ_ONLY 正确装载,只读
MEDIA_NOFS 正确装载,但不支持文件系统
MEDIA_REMOVED 已移除
MEDIA_SHARED 已经卸载并作为u盘连接电脑
MEDIA_UNMOUNTABLE 无法装载
MEDIA_UNMOUNTED 存在sd卡,但未装载
访问sdcard的路径:
4.1以前通过“/sdcard”或者“/mnt/sdcard”表示
但后面系统出现了多个sdcrad的情况
/storage/sdcard
/storage/sdcard0
/storage/sdcard1
目前为了保持和之前代码的兼容 sdcard路径做了link映射为了代码的健壮和后面新设备的兼容建议使用方法获取sdcard相关目录
Environment.getRootDirectory() /system 系统所在的目录
Environment.getDataDirectory() /data 内部存储的目录 android的路径目录
Environment.getDownloadCacheDirectory() /cache 获得sdcard下载时的缓存目录
Environment.getExternalStoragePublicDirectory(文件类型)
获得sdcard根目录下的子目录mnt/sdcard 此目录中的数据在应用卸载时不会被删除
获得某种类型文件的标准存储目录,Environment.常量
DIRECTORY_DOWNLOADS 下载
DIRECTORY_ALARMS 闹铃
DIRECTORY_DCIM 数码相机存储
DIRECTORY_MOVIES 电影
DIRECTORY_MUSIC 音乐
DIRECTORY_NOTIFICATIONS 通知音
DIRECTORY_PICTURES 图片
DIRECTORY_PODCASTS 播客
DIRECTORY_RINGTONES 铃声
Environment.getExternalStorageDirectory() 获得sdcard根目录 mnt/sdcard
不同android设备系统的这个路径是不一样 外部存储卡路径 File 对象
4.4 API19才可以在外部存储里保存app的私有目录 为了app文件在外部存储的安全性
context.getExternalCacheDir() 获得外置sdcard(外部存储)中应用程序的私有缓存目录
应用程序目录中的数据在应用程序卸载时会一起被删除
mnt/sdcard/Android/data/app包名/cache/ //获得外置sdcard中应用程序的私有目录
该方法是属于Activity类的,也就是Context的
写应用程序私有目录不加权限会警告,所以得加上权限
写入sd卡的缓存私有文件
context.getExternalFileDir()
仅自己app可以读取
context.getExternalFilesDir(Environment.DIRECTORY_MUSIC) 可以指定文件类型目录
mnt/sdcard/Android/data/app包名/files/ //获得外置sdcard中应用程序的私有目录
//应用程序私有目录中的数据会在应用卸载时一起被卸载
该方法是属于Activity类的,也就是Context的
即卸载应用时希望把和应用相关的数据也删除用该方法
该方法不一定总能访问到sd卡中的信息,如果设备自身已经有了一部分内部存储当作外部存储
那这个方法就不能访问到sd
ps:
当用户卸载app时会删除你保存在内部存储的所有文件和所有使用本app在外部存储的私有文件和私有缓存文件,从而不会留下垃圾信息
而且外部存储的这个私有文件和私有缓存文件分别对应设置-应用中的清除数据和清除缓存选项
事先知道要存储数据量的大小就可以先查询下可用空间一避免IOException
StatFS sdcard中空间的使用状态 获得sdcard空间大小
==========================================
* 获得指定空间的空间使用情况 获得sdcard和手机内存使用情况
创建对象: StatFs sf = new StatFs(File对象);//参数一般给sdcard的根目录
getBlockCount() 块的数量
getBlockSize() 块的大小
getFreeBlocks() 空闲的块数量(空闲不意味着就可用)
getAvailableBlocks() 有权可用的块数量
getFreeSpace() 返回剩余空间
getTotalSpace() 返回总空间
返回的可用空间大小并不说明你就能再存储这么多数据
如果剩余可用空间比你要存的数据大几M 或者空间被占用率小于90%都还可以 否则未必能存入
并不需要每次存文件都来判断,加个异常捕获就ok了
而且你也未必知道你要存储的数据有大多
你想判断也没法判断 所以catch这个IOEcpetion就好了