Shared Preferences

  • 即使应用被杀了,shared preference也还是存在的

Internal Storage

  • 创建于internal的文件只对本应用开放权限,即使手机用户本身也无法使用该文件。如果用户卸载该应用,那么这些文件也一起被卸载
  • 如果想在编译时就放一个文件到应用中,可以把它放到res/raw目录下,同openRawResource打开该文件。对于raw file,只能读,不能写。
  • Cache file:如果你只是想临时存储一些文件,那么可以通过getCacheDir来获得应用中用于存储临时文件的目录。当系统中的内部存储空间不够的时候,系统会删除应用中的临时文件。但是更好的做法是用户自己及时清理临时文件夹
  • 获取internla storage的一些方法包括:Context.openFileInput(), getFilesDir(), getDir(), deleteFile(), fileList()等

External Storage

  • 外部存储即可能是SD卡这种可以移除的媒介,也可能是安装在手机内部的不可以移除的媒介。存储在external storage上的文件可以被用户修改。
  • 如果应用要访问external文件,那么需要分别申请READ_EXTERNAL_STORAGE和WITE_EXTERNAL_STORAGE权限,其中获得WITE_EXTERNAL_STORAGE权限的同时也获得了READ权限,也就是说要申请读写权限的时候只要申请WRITE就可以了。从4.4开始,如果应用是访问针对本应用private的文件,那么不需要申请权限。
  • 由于external设备可以被用户卸载,因此在访问external之前,应该使用getExternalStorageState来判断external媒介的状态。
  • external存储分为public和private两种文件,其中public文件可以通过getExternalStoragePublicDirectory(),传入你想保存的文件类型和名字,比如DIRECTOYR_MUSIC和musicDir,来获得相应的文件。这样的话,系统会自动把他们分类到系统库中,并加入相应的provider(如果你不想让你的meida文件被系统扫描并加入MediaStore,那么可以在你的文件夹下面穿件一个名为“.nomedia”的空文件来阻止被系统扫描,如果你的文件真的是private的,那么应该把这些东西放到app-private目录下)。对于public文件,其他应用通过相应的系统provider或者READ_EXTERNAL_PERMISSION就可以访问得到。public文件不会跟随应用卸载而被自动删除。
  • 如果想在external上存储一些private的文件,那么应该调用getExternalFilesDir()来获取相应的文件。前面也提到,从4.4开始,访问private文件不需要申请权限,为了处理这种情况,可以这样申请权限
    <user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
    

    这样就只会在不大于18的时候申请权限了。

  • 因为private文件在应用被卸载的同时被系统删除,而且由于private文件不会被系统扫描到,所以不应该在private中存储属于用户的文件,比如用户通过你的应用编辑得到的图片或者下载的音乐,这些文件应该放在public文件中
  • 系统会在internal memory中分配一部分存储空间作为external storage,同时由于用户可能会安装比如SD卡也会被作为external storage。在4.3及更低版本中,getExternalFilesDir()方法只能获得位于internal memory上的文件入口,而次欧诺个4.4开始,getExternalFilesDirs()会返回一个file序列,分别表示位于internal和sd卡上的文件入口,并且file序列中的第一个文件被认为主要的存储位置,应用应该优先使用该位置,除非该位置已满。如果想在4.4及以上获得所有的路径,同时兼容4.3及以下的版本,那么就可以使用支持包中的ContextCompact.getExternalFilesDirs(),该方法将在4.4及以上中返回所有路径,同时在4.3及以下中只返回internal路径
  • 虽然private文件不会被其他应用通过MediaStore content provider得到,但是其他应用依然可以通过申请READ_EXTERNAL_PERMISSION权限来访问所有的external文件,当然也包括这些private文件。所以,如果你完全不想你的文件被其他应用访问到,那么应该把这些文件放到internal storage中。
  • 通过getExternalCacheDir()方法可以获取external cache文件,这些文件在应用被卸载的时候也会被自动删除。

Databases

  • 在应用中所创建的任何数据库,在应用只要知道的数据库名就可以在任何类中访问,而不可以被任何外部应用访问。
  • 推荐使用SQLiteOpenHelper来创建数据库,通过SQLiteOpenHelper.getWritableDatabase()和SQLiteOpenHelper.getReadableDatabase()来获得SQLiteDatabase对象
  • Android对SQLite是全功能支持的,没有任何限制。但是推荐给数据库使用一个自动增加的字段来作为unique ID来快速找到某个记录。如果只是应用内使用的数据,那么这个字段并不必须,但如果作为provider的数据,那么必须包含BaseColumns._ID这个字段
  • sqlite3可以用来debug数据,浏览数据库,执行查询语句

Android细笔记--DataStorage的更多相关文章

  1. Android细笔记--ContentProvider

    Provider的不常见访问方式 Batch access:访问ContentProvider的一中模式,使用该模式可以同时对provider进行多个操作,且支持同时操作多个表.使用时首先构建一个Co ...

  2. android 应用笔记

    android 应用笔记 android 应用笔记 小书匠 Android 综合教程 Android常用技巧 安卓系统架构 安卓源码开发 安卓驱动 Linux内核 安卓应用开发 Java 教程 tic ...

  3. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  4. Android开发笔记:打包数据库

    对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...

  5. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  6. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  7. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  8. Android开发笔记--hello world 和目录结构

    原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SD ...

  9. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

随机推荐

  1. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  2. [Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction

    Given a string representing an expression of fraction addition and subtraction, you need to return t ...

  3. [Swift]LeetCode695. 岛屿的最大面积 | Max Area of Island

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  4. [Swift]LeetCode835. 图像重叠 | Image Overlap

    Two images A and B are given, represented as binary, square matrices of the same size.  (A binary ma ...

  5. Java中构造方法、实例方法、类方法的区别

    1. 构造方法 构造方法负责对象的初始化工作,为实例变量赋予合适的初始值.必须满足以下的语法规则: 方法名与类名相同: 不要返回类型(例如return.void等): 不能被static.final. ...

  6. “百度杯”CTF比赛(二月场)-web-writeup

    爆破一: 打开网页看到源代码: 根据提示这题就是找变量的值,本想爆破,但不太现实.百度 php获取变量的值 有个超全局数组 $GLOBALS 爆破二: 打开网页看到源代码: 看到了eval() 函数, ...

  7. tensorflow、cuda、cudnn之间的版本对应关系

    原文链接 tensorflow-gpu v1.9.0 | cuda9.0 |  cuDNN7.1.4可行  | 备注:7.0.4/ 7.0.5/ 7.1.2不明确 tensorflow-gpu v1. ...

  8. BBS论坛(二十八)

    28.1.帖子分页功能完成 (1)manage.py 通过命令生成100个帖子,用于测试 @manager.command def create_test_post(): for x in range ...

  9. 【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

    一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程 ...

  10. IdentityServer4实战 - 必须使用HTTPS问题解析

    一. 前言 关于必须使用HTTPS这个问题,很多朋友都在群里问到了,不过由于这个问题很简单,一直也没通过文章的方式记录下来,今日有时间,便说说它的前因后果吧,给需要的人解惑~. 二. 问题发生 本文所 ...