Android存储基础及相关源码

原文

Key-Value(SharedPreference):

  • getPreferences()是Activity的接口,getSharedPreferences()是Context。前者是以Activity.getLocalClassName()为Key的
public SharedPreferences More ...getPreferences(int mode) {
        return getSharedPreferences(getLocalClassName(), mode);
}

,也就是说不能跨Activity共享

  • 源码中会检查文件是否被他人更改,标准是时间戳或大小有变化:
stat = Os.stat(mFile.getPath());
return mStatTimestamp != stat.st_mtime || mStatSize != stat.st_size;
  • onChangeListener是放到一个WeakHashMap里的
  • new 一个SharedPreferences时会启动一个线程读文件,并上锁,对get、edit等操作形成阻塞
  • 如果在get之前没有load完成,会阻塞UI线程
  • apply和commit等任务实际上是串行的,一个过长可能会阻塞后面的
  • apply和commit都会写回文件,但是apply是异步的,commit是同步的,而且commit运行在UI线程
  • 对于没有apply或commit的改变是单独存在一个Map中的,不会影响get
  • 所有editor的同步锁对象都是当前editor,也就是说,不同editor的修改是无序的,只有commit、apply的锁对象是SharedPreference,是有序的
  • SharedPreference没有使用更高级的锁,基本上可以认为文件操作上使用synchronized块就ok了

File

  • 机身内部存储是ext4格式,sd卡(包括机身内置的)是fat32格式。文件数多时,内部存储要比外部存储快很多。甚至使用仿ext4寻址方式的大文件存储小文件要比fat32直接存储要快(微信)
  • 卸载时,仅使用getExternalFilesDir()得到的外部存储文件会被清除
  • 相关文件地址:
    • getFilesDir:/data/data/package/files
    • getCacheDir: /data/data/package/cache
    • getObbDir: /sdcard/Android/obb/package—游戏数据包
    • getDatabasePath: /data/data/package/databases
    • getDir: /data/data/package/filename
    • getExternalCacheDir: /sdcard/Android/data/package/cache
    • getExternalFilesDir: /sdcard/Android/data/package/files/type

Sqlite

  • 数据库结构是由Schema(create table语句)确定的,每次load数据库都会构建Schema,所以分表可能会导致load过慢(微信)
  • 官方建议在创建Table的时候,同时构建一个contract类,把所有的常量都存起来,结构像R文件一样
  • getWritableDatabase()、getReadableDatabase()是运行很长一段时间的,所以应该在非UI线程中执行
  • 对于某一列,如果没有设值,会插入NULL,如果设置null了,则不会插入
  • 尽量不要使用rawquery方法,而是使用相应的函数,尽量避免注入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值