android数据存储的再学习

来源:互联网 发布:高考复读知乎 编辑:程序博客网 时间:2024/05/22 07:47

服务端的数据存储

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就好了




0 0
原创粉丝点击