LitePal 1.3.1发布了,从此支持图片存储!

来源:互联网 发布:js 监听键盘输入 编辑:程序博客网 时间:2024/05/29 13:31

今天LitePal又发布新版本了,带来了众望所归的二进制数据存储功能,有了这个功能,从此图片存储再也不用伤脑筋了。

只需在你的build.gradle文件当中添加下面引用即可完成升级。

compile 'org.litepal.android:core:1.3.1'

这次LitePal的更新主要包括了以下内容:

  1. 优化查询算法,使得查询速度变得更快。

  2. 增加saveFast()方法,使得存储速度变得更快。

  3. 支持二进制数据存储功能。

下面我们根据这三点更新内容分别展开详细的描述。

优化查询算法:

LitePal的查询速度其实并不慢, 因为在底层使用的就是SQLiteDatabase的API来查询的,只不过做了很多层封装而已。LitePal实际上是慢在赋值上面,因为为了简化开发者的操作,LitePal把查询和赋值这两步合到一步到当中了。我们知道,使用原生的API是要先查询得到一个Cursor对象,然后再从Cursor中把数据一个个取出并赋值到我们自己的对象当中。那么LitePal是如何做到把这两步合为一步呢?当然是借助反射了,而反射比起直接调用接口肯定是要慢一些的,这个无论如何都无可避免,所以这就是开发效率和运行效率之间的取舍。不过在反射不能变的大前提下,这次1.3.1的版本在查询算法上面进行了改进,使用一些缓存属性来提升查询效率,总体来说要比上一个版本性能好上很多。

saveFast()方法:

查询效率有了提升,那么这次在存储效率上也有了改进。之前存储我们都是用的save()方法,这个方法的强大之处在于,不仅可以将当前Model中的数据存入到相应的表中,还会分析Model之间的关联关系,并把关联关系自动解析成外键存入到表中。但是缺点在于save()方法无法事先知道当前Model有没有任何关联关系,或者开发者希不希望去分析关联关系,因此只能每次都去主动去分析,这样就会把很大一部分处理存储的时间花在分析关联上面,从而导致存储效率偏低。

那么1.3.1版本中提供的saveFast()方法则很好地解决了这个问题,因为开发者自己是很清楚当前Model是否需要处理关联关系的,如果这只是一个独立的Model,和其它Model没有任何关联,那么就可以调用saveFast()方法,从而大大提升存储效率。saveFast()方法的调用方式和save()方法是完全一样的:

Product product = new Product();
product.setName("Android Phone");
product.setPrice(1999.99);
product.saveFast();

存储二进制数据:

LitePal之前支持存储的数据类型有:int、long、short、float、double、boolean、char、String、Date九种,1.3.1版本中引入了第十种数据类型:byte[]。

也就是说,我们在Model中声明一个byte[]类型的字段,这个字段就会被自动映射到数据库表当中了。

byte[]类型的字段灵活性非常高,它可以用来存储图片,但又不仅限于存储图片,任何二进制的数据都是可以存储的,比如一段小语音,或者是小视频,但不建议在手机数据库中存储较大的二进制数据。

下面来举个具体使用的例子,首先我们在Model中添加一个byte[]类型的字段:

public class Product extends DataSupport {    

private String name;

private double price;

private byte[] image;
// generated getters and setters. ...
}

然后存储一张图片时就可以这样写:

byte[] imageBytes = getImageBytesFromSomewhere();
Product product = new Product();
product.setName("Android Phone");
product.setPrice(1999.99);
product.setImage(imageBytes);
product.saveFast();

用法非常简单吧,那存储成功了查询该怎么写呢?查询的写法完全没有改变,自动就可以把当前对象的二进制数据一起给查出来:

Product product = DataSupport.find(Product.class, id);
String name = product.getName();
double price = product.getPrice();
byte[] imageBytes = product.getImage();

但是如果有时候我想只查一些基本数据呢?毕竟把二进制数据一起查出来了肯定会影响效率的,这种情况我们可以借助LitePal的级联查询来解决:

Product product = DataSupport.select("name", "price").where("id = ?", id).find(Product.class);

这种写法指定只查询name和price这两列,image这一列数据是不会被查询出来的,因此就完全不会影响效率了。

这次版本的主要更新内容大概就是这些了,点击阅读原文可以访问LitePal项目的主页。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新建定额项目没有措施项目怎么办 太岁符忘记烧了怎么办 穿裙子去了寺庙怎么办 美甲彩绘胶干了怎么办 美甲彩绘胶稀怎么办 彩绘胶弄衣服上怎么办 彩绘胶买来太稠怎么办 做指甲没有底胶怎么办 交定金后发现房屋不合法怎么办 买车付了定金不想要了怎么办 买车付定金后不想要怎么办 非法经营的产品至人伤亡怎么办 返修漆施工不对色怎么办 叶子板撞变形了怎么办 挤了三角区疖子怎么办 三角部位太鼓的怎么办 美利车车贷逾期怎么办? 外墙保温层坏了怎么办 双胞胎34周血压高怎么办 夏天穿凉鞋脚后跟干裂起硬皮怎么办 穿凉鞋脚后跟干裂起硬皮怎么办 夏天穿凉鞋磨脚怎么办 lv皮带黑色掉漆怎么办 黑色衣服穿在身上掉色怎么办 电信卡流量超了怎么办 移动卡流量超了怎么办 狗狗老是挠痒痒怎么办 出差同住的同事睡觉打鼾怎么办 小孩皮肤太黑了怎么办 苹果平板突然黑屏打不开怎么办 孩子认人晚上哭怎么办 主腹动脉有硬块怎么办 糖链抗原125偏高怎么办 狗长了个肿瘤怎么办 腺肌瘤糖类抗原125升高怎么办 糖类抗原724单项升高怎么办? 化疗期间糖类抗原升高怎么办? 门面租客到期不搬怎么办 这几天老想初恋怎么办 结婚了还想初恋怎么办 九年了想初恋了怎么办