LitePal简介


LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表、増删改查的操作。

LitePal项目地址:https://github.com/LitePalFramework/LitePal

一、更新表结构

使用LitePal框架需要在项目中新建一个含litepal.xml文件的assets文件夹,以及创建各个实体类,实体类应继承LitePalSupport类。

litepal.xml应包含如下代码:

<?xml version="1.0" encoding="utf-8"?>

假如我们的实体类是这样的:

public class Album extends LitePalSupport {

private String name;

private float price;

private byte[] cover;

private Date releaseDate;

private List songs = new ArrayList();

// generated getters and setters.

}

此时如果需要更新表结构,只需修改实体类,并更改litepal.xml中的数据库版本号,在下一次操作数据库时就会更新表结构,非常巧妙的设计,那么他究竟是怎么实现的呢?让我们一起去看源码吧。

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Generator.upgrade(db);

SharedUtil.updateVersion(newVersion);

}

这里首先继承了SQLiteOpenHelper类,并重写了onCreate()和onUpgrade()方法。

Generator中的upgrade(SQLiteDatabase db)方法:

static void upgrade(SQLiteDatabase db) {

drop(db);

create(db, false);

updateAssociations(db);

upgradeTables(db);

addAssociation(db, false);

}

第一步删除原数据库,第二步创建新数据库,第三步更新数据库表(移除外键),第四步更新所有数据库中的表,第五步添加外键。各方法的具体实现这里就不赘述了,想了解请移步github。

SharedUtil中的updateVersion(int newVersion)方法:

public static void updateVersion(int newVersion) {

SharedPreferences.Editor sEditor = LitePalApplication.getContext()

.getSharedPreferences(LITEPAL_PREPS, Context.MODE_PRIVATE).edit();

sEditor.putInt(VERSION, newVersion);

sEditor.commit();

}

很明显,这段代码是将新的版本号用SharedPreferences保存在本地。

二、保存数据

使用LitePal保存数据示例:

Album album = new Album();

album.setName(“album”);

album.setPrice(10.99f);

album.setCover(getCoverImageBytes());

album.save();

这个save()方法是继承父类LitePalSupport的方法,想要进行CRUD操作,实体类必须继承LitePalSupport类。现在我们一起来看一下save()方法是怎么实现的:

/*@return If the model is saved successfully, return true. Any exception

  •     happens, return false.
    

*/

public boolean save() {

try {

saveThrows();

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

savaThrows()方法:

public void saveThrows() {

synchronized (LitePalSupport.class) {

SQLiteDatabase db = Connector.getDatabase();

db.beginTransaction();

try {

SaveHandler saveHandler = new SaveHandler(db);

saveHandler.onSave(this);

clearAssociatedData();

db.setTransactionSuccessful();

} catch (Exception e) {

throw new LitePalSupportException(e.getMessage(), e);

} finally {

db.endTransaction();

}

}

}

这里主要看onSave()方法,这是onSave()方法的关键代码:

String className = baseObj.getClassName();

List supportedFields = getSupportedFields(className);

Collection associationInfos = getAssociationInfo(className);

if (!baseObj.isSaved()) {

analyzeAssociatedModels(baseObj, associationInfo
s);

doSaveAction(baseObj, supportedFields);

analyzeAssociatedModels(baseObj, associationInfos);

} else {

analyzeAssociatedModels(baseObj, associationInfos);

doUpdateAction(baseObj, supportedFields);

}

如果是已经已经保存的对象则直接执行更新操作,否则执行保存操作。

接下来继续看doSavaAction()方法:

private void doSaveAction(LitePalSupport baseObj, List supportedFields, List supportedGenericFields)

throws SecurityException, IllegalArgumentException, NoSuchMethodException,

IllegalAccessException, InvocationTargetException {

values.clear();

beforeSave(baseObj, supportedFields, values);

long id = saving(baseObj, values);

afterSave(baseObj, supportedFields, supportedGenericFields, id);

}

beforeSave()方法:在保存之前,先对其进行解析,把所有的数据包括字段值和外键值保存在ConteneValues中。saving()方法,返回值是long:

private long saving(LitePalSupport baseObj, ContentValues values) {

onTargetException {

values.clear();

beforeSave(baseObj, supportedFields, values);

long id = saving(baseObj, values);

afterSave(baseObj, supportedFields, supportedGenericFields, id);

}

beforeSave()方法:在保存之前,先对其进行解析,把所有的数据包括字段值和外键值保存在ConteneValues中。saving()方法,返回值是long:

private long saving(LitePalSupport baseObj, ContentValues values) {

LitePal框架浅析,阿里正式启动2021届春季校招相关推荐

  1. 阿里正式启动2021届春季校招!java算法工程师,看完跪了

    容器化时代来了 虚拟化技术已经走过了三个时代,没有容器化技术的演进就不会有 Docker 技术的诞生. (1)物理机时代:多个应用程序可能会跑在一台机器上. (2)虚拟机时代:一台物理机器安装多个虚拟 ...

  2. 阿里正式启动2021届春季校招!2021Java不死我不倒,好文推荐

    前言 在本篇文章开始前,我想想来回答一个问题:我为什么要写这一篇关于面试的文章? 原因有三:第一,我想为每一个为梦想时刻准备着的"有心人"尽一份自己的力量,提供一份高度精华的Jav ...

  3. 阿里正式启动2021届春季校招!字节跳动Android面试凉凉经,实战解析

    前言 大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- ...

  4. 张一鸣:“如果是你偶然发现青霉素能消炎,阿里正式启动2021届春季校招

    在这里举个反例:两个我印象比较深刻的年轻人,素质.技术都蛮不错,也都挺有特点.我当时是他们的主管,发现他们在工作中deliver(传递)的感觉始终不好. 他们觉得其他同事做得不如他们,其实不是:他们确 ...

  5. Java面向对象封装和继承,阿里正式启动2021届春季校招

    封装,它也是面向对象思想的特征之一.面向对象共有三个特征:封装,继承,多态.接下来我们具体学习封装. 封装的表现: 1.方法就是一个最基本封装体. 2.类其实也是一个封装体. 从以上两点得出结论,封装 ...

  6. 再见SpringMVC!字节跳动正式启动2021届秋季校招!不可思议!

    什么是 Spring Boot Java (面向对象编程语言)经过30多年的发展,产生了非常多的优秀框架.Spring (为解决企业应用程序开发的复杂性而创建的框架)曾是最受欢迎的Java框架之一, ...

  7. 腾讯全资子公司 CODING 2021 届春季校招补录全面启动!

  8. 【我,不止于此】TCL电子泛智屏BU研发中心2021届春季校招来袭!

    [内推码]opbper(投递简历时填写内推码即可) [投递方式] PC端 登陆 campus.tcl.com 点击"应届生" 点击筛选" TCL实业 -泛智屏BU-研发中 ...

  9. 顺丰科技2021届春季招聘正式启动!

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:顺丰 AI博士笔记系列推荐 周志华<机器学习>手 ...

最新文章

  1. 自动驾驶平台,阵营, 主要传感器与场景联系
  2. linux lvm 大小与硬盘大小关系,linux lvm扩容磁盘大小
  3. 区块链赚钱的9种方式
  4. Oracle快速克隆安装
  5. 并发异步处理队列 .NET 4.5+ (改进性能计数器) 2013-11-16
  6. PHP面试题:你常用到的mysql命令?
  7. nginx 响应服务器静态,405 Not Allowed,nginx静态文件响应post请求
  8. 6 SD配置-企业结构-定义-定义装运点
  9. 没有桌面体验功能就不能进行图片打印
  10. 嘉年华,历数风流人物
  11. 编号001!华为超级旗舰入网:获中国首张5G手机“身份证”
  12. 独立站的优势是什么?独立站注意事项有哪些?
  13. 媲美Siri语音 英朗自然语音识别系统体验
  14. maven package 打包报错 Failed to execute goal
  15. python分词与去停用词简单实操
  16. shell编程实战总结
  17. TexMacs环境变量
  18. 数据之路- 中国五城市PM2.5数据解读
  19. 【CyberSecurityLearning 12】数据链路层 及 交换机工作原理与配置
  20. TapTap排行榜能客观显示游戏的受欢迎程度吗?

热门文章

  1. C++里string转换为int
  2. 3分钟掌握自给IP地址
  3. 精华文稿|用于无监督双目立体匹配学习的视差注意力机制
  4. 百度地图坐标查询(真实坐标)
  5. 知乎周源微信_每周源代码33-Google Chrome中的Microsoft Open Source
  6. SpringMVC 源码分析之 FrameworkServlet
  7. 苹果电脑错误代码43_苹果最臭名昭著的代码错误
  8. 怎么开发联机小游戏_Q飞机游戏:空战吃鸡大乱斗游戏!好玩的联机Q飞机对战小游戏...
  9. java unpark_LockSupport中的park与unpark原理
  10. 人脸验证:Lightened CNN