您的位置:首页 > 移动开发 > Android开发

android数据存储的再学习

2016-11-10 18:21 302 查看
服务端的数据存储

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就好了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: