存储(数据持久化)

SharedPreferences

SharedPreferences读取数据都使用awaitLoadedLocked同步锁,故是线程安全的。

SharedPreferences在创建时会把整个文件加载进内存,会一直在内存。每次edit都会创建一个Editor对象,Editor对象会备份当前文件的数据map。

commit、apply区别

apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘,;而commit是同步的提交到硬件磁盘,会阻塞调用它的线程。

每次apply会将一个带有await的写入任务加入写入队列,这个写入队列交给一个只有单个线程的线程池去执行;如果有很多写入任务,则当App执行onStop时,需要等写入线程执行完才能停止。

Base64编码:如果要用 SharedPreferences 存取复杂的数据类型(类,图像等),就需要对这些数据进行编码。通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。

文件存储

内部存储、外部存储及Ram,Rom,扩展存储概念

内存(Ram)、内部存储(Rom)、SD卡(TF卡)

4.4以前机身存储就是内部存储,外置SD卡就是外部存储,我们通过getDataDirectory就可以获取内置存储根路径,通过getExternalStorageDirectory就可以获取外置SD卡根路径。

4.4及以后机身存储包含了内部存储和外部存储,其中通过getExternalStorageDirectory获取的是机身存储的外部存储,而外置SD卡我们则需要通过getExternalDirs遍历来获取了。

外部存储路径:

机身外部存储:/storage/emulated/0/Android/data/packname/files/mounted
SD卡的路径:/storage/B3E4-1711/Android/data/packname/files/mounted

访问外部存储的API方法(带有External外部)
1、Environment.getExternalStorageDirectory().getAbsolutePath():外部存储的根路径
2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath():外部存储的根路径
3、getExternalFilesDir(“”).getAbsolutePath():某个应用在外部存储的file路径
4、getExternalCacheDir().getAbsolutePath():某个应用在外部存储的cache路径

内部存储

Environment.getDataDirectory():内部存储的根路径

getFilesDir().getAbsolutePath():某个应用在内部存储的file路径

getCacheDir().getAbsolutePath():某个应用在内部存储的cache路径

getDir(“myFile”, MODE_PRIVATE).getAbsolutePath():某个应用在内部存储的自定义路径

其他存储路径

Environment.getDownloadCacheDirectory() = /cache
Environment.getRootDirectory() = /system

存储路径总结

/data目录下的文件物理上存放在我们通常所说的内部存储里面

/storage目录下的文件物理上存放在我们通常所说的外部存储里面

/system用于存放系统文件

/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的

SQLite数据库存储

android 内置的数据库,非常轻量级,占用资源非常低(可能只有几百K内存)。

sqlite更改数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。

共享锁和独享锁

写数据库之前,首先需要先读数据库,所以读写操作都会先获取文件的共享锁,一个共享锁允许多个连接进行读操作。如果写操作就会变成独享锁,独享锁会阻止新的共享锁生成,防止因大量连续的读操作而无法获得写入的机会。

所以从sqlite本身的机制看来事务的方式去提交数据,本身是多线程乃至多进程数据安全的,但是android在并发写的时候还是会爆出数据库锁住的异常,我们在开发过程中需要尽量避免。

SQLiteDatabase使用

创建一个类继承SQLiteOpenHelper
SQLiteOpenHelper是SQLIteDatabase一个辅助类,用于生成一个数据库,并对数据库版本进行管理。

当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:


onCreate(SQLiteDatabase)
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

onUpgrade(SQLiteDatabase,int,int) 当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

onOpen(SQLiteDatabase): 这是当打开数据库时的回调函数,一般在程序中不是很常使用。

ContentProvider

作为Android四大组件之一,ContentProvider一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。它有2个主要作用:
1.封装。对数据进行封装,提供统一的接口。
2.提供一种跨进程数据共享的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值