LitePal框架浅析,阿里正式启动2021届春季校招
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届春季校招相关推荐
- 阿里正式启动2021届春季校招!java算法工程师,看完跪了
容器化时代来了 虚拟化技术已经走过了三个时代,没有容器化技术的演进就不会有 Docker 技术的诞生. (1)物理机时代:多个应用程序可能会跑在一台机器上. (2)虚拟机时代:一台物理机器安装多个虚拟 ...
- 阿里正式启动2021届春季校招!2021Java不死我不倒,好文推荐
前言 在本篇文章开始前,我想想来回答一个问题:我为什么要写这一篇关于面试的文章? 原因有三:第一,我想为每一个为梦想时刻准备着的"有心人"尽一份自己的力量,提供一份高度精华的Jav ...
- 阿里正式启动2021届春季校招!字节跳动Android面试凉凉经,实战解析
前言 大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- ...
- 张一鸣:“如果是你偶然发现青霉素能消炎,阿里正式启动2021届春季校招
在这里举个反例:两个我印象比较深刻的年轻人,素质.技术都蛮不错,也都挺有特点.我当时是他们的主管,发现他们在工作中deliver(传递)的感觉始终不好. 他们觉得其他同事做得不如他们,其实不是:他们确 ...
- Java面向对象封装和继承,阿里正式启动2021届春季校招
封装,它也是面向对象思想的特征之一.面向对象共有三个特征:封装,继承,多态.接下来我们具体学习封装. 封装的表现: 1.方法就是一个最基本封装体. 2.类其实也是一个封装体. 从以上两点得出结论,封装 ...
- 再见SpringMVC!字节跳动正式启动2021届秋季校招!不可思议!
什么是 Spring Boot Java (面向对象编程语言)经过30多年的发展,产生了非常多的优秀框架.Spring (为解决企业应用程序开发的复杂性而创建的框架)曾是最受欢迎的Java框架之一, ...
- 腾讯全资子公司 CODING 2021 届春季校招补录全面启动!
- 【我,不止于此】TCL电子泛智屏BU研发中心2021届春季校招来袭!
[内推码]opbper(投递简历时填写内推码即可) [投递方式] PC端 登陆 campus.tcl.com 点击"应届生" 点击筛选" TCL实业 -泛智屏BU-研发中 ...
- 顺丰科技2021届春季招聘正式启动!
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:顺丰 AI博士笔记系列推荐 周志华<机器学习>手 ...
最新文章
- 自动驾驶平台,阵营, 主要传感器与场景联系
- linux lvm 大小与硬盘大小关系,linux lvm扩容磁盘大小
- 区块链赚钱的9种方式
- Oracle快速克隆安装
- 并发异步处理队列 .NET 4.5+ (改进性能计数器) 2013-11-16
- PHP面试题:你常用到的mysql命令?
- nginx 响应服务器静态,405 Not Allowed,nginx静态文件响应post请求
- 6 SD配置-企业结构-定义-定义装运点
- 没有桌面体验功能就不能进行图片打印
- 嘉年华,历数风流人物
- 编号001!华为超级旗舰入网:获中国首张5G手机“身份证”
- 独立站的优势是什么?独立站注意事项有哪些?
- 媲美Siri语音 英朗自然语音识别系统体验
- maven package 打包报错 Failed to execute goal
- python分词与去停用词简单实操
- shell编程实战总结
- TexMacs环境变量
- 数据之路- 中国五城市PM2.5数据解读
- 【CyberSecurityLearning 12】数据链路层 及 交换机工作原理与配置
- TapTap排行榜能客观显示游戏的受欢迎程度吗?
热门文章
- C++里string转换为int
- 3分钟掌握自给IP地址
- 精华文稿|用于无监督双目立体匹配学习的视差注意力机制
- 百度地图坐标查询(真实坐标)
- 知乎周源微信_每周源代码33-Google Chrome中的Microsoft Open Source
- SpringMVC 源码分析之 FrameworkServlet
- 苹果电脑错误代码43_苹果最臭名昭著的代码错误
- 怎么开发联机小游戏_Q飞机游戏:空战吃鸡大乱斗游戏!好玩的联机Q飞机对战小游戏...
- java unpark_LockSupport中的park与unpark原理
- 人脸验证:Lightened CNN