存储优化

xiaoxiao2021-02-28  116

存储方式 SharedPreferences、File、SQLite、ContentProvider

SharedPreferences 使用简单,速度快,配置数据的首选存储方式; 只能存储boolean、int、float、long、String5种简单的数据类型

File 常用于存储大数量的数据;更新数据麻烦 适于读写大量的流式数据,如媒体文件和其他网络传输内容

Android系统将文件存储区域分为内部存储和外部存储两部分。 主要区别在于:

内部存储空间内文件默认只有创建文件的应用可以访问,而外部存储所有应用都可访问内部存储在应用卸载后,数据一并删除外部存储在有的设备上可移除,故使用外部存储,需要判断是否已挂载

一般一些应用的配置文件放内部存储,在应用创建文件不需要访问限制、应用需要将文件分享给其他应用,或支持用户通过PC访问,优先考虑外部存储 在AndroidManifest中指定android:installLocation可指定应用安装位置

SQLite 多线程访问数据;需要事物处理;需要处理变化的复杂数据结构

ContentProvider 用于 程序间数据交换,通过实现ContentProvider将自己的数据暴露出去

SharedPreferences优化 SharedPreferences实际是对一个xml文件存储key-value,每次commit、apply都是一次I/O写操作。I/O操作是最慢的操作之一。 SharedPreferences性能优化主要是两方面:IO性能、同步锁问题。 IO性能是导致SP性能差最大原因,SP上IO分为读取数据到内存和数据写入磁盘两种情况。 当SP文件尚未被加载到内存时,调用getSharedPreferences方法会初始化文件并读入内存,容易导致耗时。 Editor的commit或apply方法每次执行时,同步写入磁盘耗时较长。两方法的区别在于同步写入和异步写入,以及是否需要返回值。在不需要返回值,使用apply方法可极大提高性能。 SP类中commitToMemory方法会锁定SP对象,put和getEditor方法会锁定Editor对象,写入磁盘会锁定一个写入锁。因此需要避免频繁读写SP,减少不需要的调用。而对于SP的批量操作,先获取一个Editor对象,进行批量操作,然后调用apply方法。 跨进程读写SP需要用到ContentProvider,对所有SP操作套上了ContentProvider进行访问,耗时增加3倍左右,故尽量避免跨进程操作。

数据库优化 (1) 、SQLiteStatement 利用SQLiteStatement类插入数据,性能上有一定提高,并解决了SQL注入问题。

private boolean insert(Info info){ getSQLiteStatement().clearBindings(); getSQLiteStatement().bingLong(1, info.getId()); getSQLiteStatement().bingString(2, info.getName()); return getSQLiteStatement().executeInsert() > 0; }

(2)、事务 对于批量插入数据,事务是提高速度最有效的方法。 实际上每执行一次插入操作,系统会自动创建一个事务,在插入后立即提交,如果插入频繁,就会频繁创建事务,影响速度。所以需要显示创建事务,显示创建事务的两个基本特性:原子提交;性能更好。

//... mSQLiteDatabase.beginTransaction(); try{ //... mSQLiteDatabase.setTransactionSuccessful(); }catch(Exception e){ //... }finally{ mSQLiteDatabase.endTransaction(); }

(3)、索引 索引维护一个表中某列或某几列的顺序,可快速定位到一组值,而不需要扫遍全表。所有的索引信息会保持在一个独立的索引表中,故会产生额外的空间占用。在数据库进行大量的读以及搜索操作时优势非常明 显。 SQLite会自动为每一个UNIQUE列创建索引,包括主键,另外可以通过CREATE INDEX显示创建。 索引可提高查询速度,2个明显的缺点在于:数据库的插入、更新和删除使用索引会变慢。因为删除/更新也需要删除这个索引。建立索引会增加数据库大小。 以下场景不建议使用索引: 在较小的表上;在有频繁的大批量更新或插入操作的表上;在含有大量NULL值的列上;在频繁操作的列上。

(5)、异步线程,写数据库统一管理 耗时操作,放到异步中操作。同时为了保证数据同步和避免一些死锁等待,考虑双缓冲机制。双缓冲是指在操作时,把一些常用的数据放到内存缓存中,再异步更新到数据库中。把所有的数据库操作统一放到一个线程队列执行。

(6)、提高查询速度 影响查询速度主要有:查询数据量的大小;查询数据的列数;排序的复杂度。

转载请注明原文地址: https://www.6miu.com/read-46984.html

最新回复(0)