Android数据库高手秘籍(十一),LitePal支持事务功能了

前语

LitePal 内部的 API 在很早之前就支撑了业务功用,由于要确保数据操作的原子性,不能出现部分成功部分失利的状况。

咱们早上好,时隔两年之久,Lit二进制手表ePal 今天总算又更新了!

是的,我看了一下业务文书简报的期数指的是时刻,LitePal 的上个版别仍是 2018 年 10 月份发布的,之后就再也没有更新业务过。由于我接下来将首要的时刻都放在业务了 giffun 这个项目上,忙完 giffun 紧接着又初步编写《第三行代码》,以至于gitlab完全没有时刻和精力去保护 LitePal。

期间有不少朋友咨询过我,是不是扔掉保护 Ligithub永久回家地址tePal 了?莫名感到有点心酸,我欠这个项目的有点多了。

那么时隔两年之后的更新,工商银行LitePal 又产生了git指令什么改动呢?咱们一宫颈癌前期症状同来看一看吧。

LitePal的改动

这两年时刻里,我不光没有时刻更新 LitePal 的功用,甚至连 GitHub 上的 issues 都无暇顾及业务,以至于积累了许多的 issues。那么在开发新功用之前,首先要做的,肯定是处理这些 issu业务es。

我将悉数的 issues 都阅读一遍之后,发现大体能够归为以下几类:

  1. 用法的咨询。关于这类 issue 我基本都进行了回复,只是回复的有点太晚了,或许没能帮上你们的忙,这儿十分抱愧。

  2. 功用上的主张。这些年来许多朋友都在 LitePal 的功用性方面供给了不少主张,也让 LitePal 变得愈加健壮。不过关于功用主张方面的作业我待会还会再谈,这儿暂时google先跳过。

  3. 系统类型的 Bug。有些朋友运用 LitePal 时遇到了溃散,就认为是 LitePal 的 bug,但有的时分并非如此。比方 CursorWindows 这个 b二进制转八进制ug 被提了好几次,但其实这是系统底层的捆绑,CursorWindow 缓存数据达到最大捆绑就会抛出失常。即便你不运用 LitePal,用原生的 SQLiteDatab接口卡ase 也会业务所是干什么的出现这个失常,所以这种问题我确实无法批改,咱们只能在运用层面尽量减少这种一次性加载许多数据的场景。

  4. LitePal 的 Bug。关于提出这类问题的朋友我十分感谢,这次确实又发现宫颈癌了几个 LitePal 内部的 bug。比方特定状况下晋级数据库工程造价会丢掉数据、DaGotgit教程e 类型字段无法保存 1970 年从前的数据、findFirst() 办法在某二进制些时分查询速度会十分慢等等。这次在开发新版别之前业务阻隔等级,我将这些提出的 bug 悉数都进行了批改,确保这是一个愈加安稳的版别。

那么现在 LitePal 的 GitHub 中还剩下多少 issue 呢?给咱们看一下:

Android数据库高手秘籍(十一),LitePal支撑业务功用了

没错,github中文官网网页就只剩下一个了。并且这是一个新功用的主张,我确实计划在之后的版二进制转化器别中考虑参加这个功用,所以暂时将它保存了下来。

好了,现在 issuesGo狗狗币处理掉了,接下来总算能够对龚俊 LitePal 进行晋级了。

在之前的 LitePal 3.0.0 版别傍边,我为了让它支撑一些 Kotlin 中不错的语法特性,将本来的一个库变成了两个库,如下图所示:

Android数据库高手秘籍(十一),LitePal支撑业务功用了

github是干什么的的,运用哪种编程言语就引入哪个库,我本来认为这是一件很好的作业,可是没过多久我就接口懊悔了,这是一个十分过失的选择。

将库分成了 Java 和 Kotlin 两个版别之后,它们又会一起引入 Core 库来作为依托,Core 库是主业务逻辑结束的当地。那么当需求添加什么新功用的时分,我需求在 Core 库中进行具体的功用结束,然后在 Java 库中添加一个对外接口,在 Kotlin 库中添加一个对外接口,还要为 Kotlin 的专属语法再添加一个对外接口。本来只需求在一个当地保护二进制手表的代码现在变成了要在四个当地保护,悉数 API 的数量也变成了四倍,导致代码保护本钱急剧添加。

这个问题是我必须要处理的,否则往后 LitePal 会变得越来越难保护。所以,在最新的 L业务所itePal 3.1.1 版别傍边,现已不再差异 Java 版和 Kotlin 版,而是一致合并成一个库。只需求声明以下依托库地址,即可将 Li业务员t接口的界说ePal 晋级到 3.1二进制手表.1 版别,Java 和 Kotlin 言语都能够运用:

dependencies {
impgit教程lementation 'org.litepal.guolingiti轮胎dev:core:3.1.1'
}

合二为一之后,许多冗余的代码就都能够删去了,保护本钱也骤降了许多。至所以怎样结束的,这首要得感谢 bintray-release 这个开源库(github.com/novoda/bint… jcentgiti轮胎er 之前,会先解析当时项目的依托状况,工商管理然后将项目所需求依托哪些库一起二进制转十进制计算器声明到 pom 文件傍边。二进制转化为十进制比方 LitePal 3.1.1 版其他 pom 文件如下所示:

Android数据库高手秘籍(十一),LitePal支撑业务功用了

能够看到,这儿在 dependencies 傍边声清楚 LitePal 是需求依托 Kotlin 的一些作业时库的,假定你当时的项目中接口crc过错计数没有这些库(比方是运用 Java 开发的项目),那么 Gradle 会自动将这些依托下载下来,以确保 LitePal 能够正常作业。

二进制转化为十进制样就不必再专门为 Java 和龚俊 Kotlin 供给两个版其他库了,而是一份代码一起兼容两种言语,大快人心。

这儿我想要回到方才功用主张的论题。

LitePal 从诞生一贯git教程到现在,其实都还算是一个比较小众的开源库。由于自身移动端数据库的需求就不是特别强,再加上 LitePal 也不是移动数据库结构中做得最出色的那个,所以不或许得到悉数人的认可。

可是也有不少 Android 开发者,他们对 LitePal 特别喜爱,觉得这个库简略好用,能够省去编写许多代码。有一些热心的朋友会向我二进制手表提出许多主张,参加某某之类的功用,然后让这个库变得愈加健壮。

我特别感谢向我提出主张的这些朋友们,能够说在很大程度上,LitePal 的版别迭代更接口自动化新都是在你们的主张根底上进行的。

可是,迭代了这么多版别之后,我回过头来反思一接口自动化下,是不是每一个主张都值得选用呢?这是要打上问号的。

由所以一个小众开源库,主张自身或许就不太多,所以我很乐意听取,并在这些主张的根底上做加业务的四个特性法。可是做了这么多年加法之后,我发现工商管理有些主张其实并不怎样合理,也不被大多数开发者所需求。加二进制转化为十进制上这些功用之后,还会使得 LitePal 变得不Go安稳,或者是保护变得更接口和抽象类的差异加困难。

所以,这次我选择对 LitePal 做减法。

通过细心考虑之后,我选择分阶段砍去以下三部分内容。

1业务文书. 二进制数据存储

这个功用是我十分不应该添加的一个功用,由于数据库自身就不适宜存储二进制数据。为什么呢?二进制数据一般都会很大,一张高清图片或许就会占据几 M 的内存,将这种数据存放到数据库中是比较风险的,很或许会引发方才说到龚俊的 CursorWindows 的过失导致程序溃散,这就让 LitePal 变得不行安稳。

那么又有多少开发者会有向数据库中存储二进制数据接口crc过错计数的需求呢?这个真的很业务文书简报的期数指的是少,由于大部分人的做法都是将二进制数据以文件的方式存储到本地,然后在数据库中存储一条文件的途径就能够了。这种做法愈加科学安全,也不会二进制给数Go据库二进制计算器添加额定的压力。

因而,从 LitePal 3.1.1 版别初步,Go将不再支撑存储和读取二进制数据功用(实体类中界说的 byte 数组字段将被忽略),此项改动当即收效,假定有用到这部分功用的朋友,请在晋级之前结束公积金批改。

2. 异步操作

数据库操作需求异步进行,这个是一种十分提倡的行为,由于操作接口类型数据库自身便是比较耗时的。

可是,数据库操作需求异步进行,就意味着数据库结构需求供给异步功用吗?我从前是这么认为的,所以我在 LitePal 中加了许多异步操作的接口,不过现在我意识到,我又做错了。

由于除了数据库操作之外,有许多其他耗时操作也需求异步进行。异步这个论题翻开来讲能够讲很深,也有极多的 API 和开源库能够用来结束异步功用,比方 Java 线github是干什么的程池、RxJav业务性作业是什么意思a、协程等等。所以 LitePal 其实并不应该承担这个职责,有许多更适宜的结构会专门处理这个作业。举个比方,Google 的 Room 就完全没有供给异步操作数据库接口,可是默许状况下 Room 还强制要求你必须在非主线程进行数据库操作,否则就会溃散。

接口的界说外,LitePal 的异步操作接口规划得也确实十分欠好,导致后期保护本钱很高。比方说查询数据有一个 find 接口,那么为了能够异步查询数据,我接口测验就又供给了一个 findAsync 接口。删去数据有一个 delete 接口,为了能够异步删去数据,我就又供给了一个 deleteAsync 接口。咱们发现问题了没有?为了供给异步操作,我将 API 的数量翻倍了,再加上之前又将库分为了 Java 和 Kotlin 两个业务所是干什么的版别,API 在翻倍的根底之上又翻了四倍,保护本钱指数级添加。

所以,在异步操作方面,我准备继续做减法,LitegiteePal 不再额定承担异步处理作业,可是也不会像 Room 那样强制要业务求开发者必须在非主线程操作数据库。终究是接口测验面试题在主线程还对错主线程操作数据库,全凭咱们自由选择。假定你们的github中文官网网页项目中现已运用了 RxJava 或协程等技能,异步处理信任关于你来说自身便是一件很轻松的作业,也完全用不着运用 LitePal 供给的异步操作接口。

考虑到老项目的兼容性,此项改动并不会当即收效,现二进制转化为十进制在只是悉数的异步接口都被符号为了扔掉,但在下一个版别傍边将会完全移除,所以也请咱们不要再继续运用这些接口了。

3. 数据库存储方位

Li接口crc过错计数tePal 在 1.6.0 版别傍边,引入工商银行了将数据库存储到外业务所置 SD 卡的功用二进制转化器,首要是为了便当我接口的界说们调试程序。可是这种行为是极点风险的一种行为,会大大影响应用程序的安全性,由于谁都能够随意地更改数据库中的数接口据。

这个功用终究该去该留,我也考虑了良久。一方面是觉得giti,像 Room 这种 Googithub永久回家地址gle 官方的数据库结构都没有供给将数据库存储到外置 SD 卡的功接口是什么用,LitePal 为什么要多做这件作业。另一方面又觉得,数据库难以调试这确实是一个开发者的痛点。

深思熟虑之后,我选择暂接口文档时继续保存这个功用,可是宫颈癌前期症状随着未来开发调试环境越来越兴隆(比方 Android Studio二进制手表 4.gitee1 中现已引入数据库调试功用了),我毕竟仍是会移除这个功用。

用过 LitePal 的朋友都知道,在 LitePal 傍边向数据库存储一条数据是十分简略的,只需求调用如下代码即可:

Persongit教程 person = new Person();
person.setXXX(...);
...
person.save();

save 办法是 LitePal 供给的一个接口,它会解析当二进制亡者列车时政策中包含的数据、字段、相相联系等信息,然后将解业务所宫颈癌前期症状出来的数据存储到数据库表对应的列傍边。

存储一条数据是上面这种写法,那么假定我要存储一个集结傍边的数据应该怎样做呢?当然你能够这样写:

List<Person> personList = ...giti
for (Person persogitin : personList) {
person.save();
}

得到了一个集结之后,咱们只需求循环遍历这个集结,调用每个 Person 政策的 save 办法就能够了。

可是方才有说到,LitePal 的 save 办法中会解析当时政策包含的数据、字段、相相联系等信息。你会发现除了数据是会改动的之业务局外,像字二进制转十进制计算器段、相相联系这种信息每个政策都是相同的,github中文官网网页所以每次循环都去解析一遍这些信息无疑会添加存储耗时。

为此 LitePal 供给了一接口测验面试题个 saveAll 办法,专门用于存储集结类型的数git指令据,比方结束上述相同的功狗狗币用,也能够这样写:

List<Person&ggitit; personList = ...
LitePal.sav工程造价eAll(personList);

这两种写法结束的功用git指令是如出一辙的,可是 saveAll 办法只会将 Person 政策中的字段与相相联系解析一次,因而存储功率将会大幅提二进制八进制十进制十六进制转化升。

可是,saveAll 办法也有一个缺点,便是假定存储的集结傍边,有部分数据存储成功了,部分数据存储失利了怎样办?要知道,saveAll 办法并没有回来值。

为了处理这种状况,LitePal 3.1.1 版别傍边特意添加了 saveAll 办法的回来值。

saveAll 办法会回来 true 和 false 两种回来值,true 标明集结中的悉数数据都存储到了数据库傍边,false 标明存储进程中产生了失常,没有任何数据存储到了数据库二进制八进制十进制十六进制转化傍边。是的,saveAll 办法内部打开了业务,要么悉数存储成功,要么悉数存储失利,不会出现部分存储成功的状况,这样能够避免许多运用 saveAll 办法时产生的误解。

另外,在google 3.1.1二进制转十进制计算器 版别傍边,我还为 Kotlin 供给了 saveAll 办法的专属语法糖,假定你的项目运用的正是 Kotlin 言语的话,能够用如下写法来调用 saveAll 办法:

val personList: List<Person> = ...
personList.saveAll()

很明显,这种写法变得愈加新鲜了。

LiGittePal 内部的 API 在很早之前就支撑了事接口和抽象类的差异务功用,由于要确保数据操作的原子性,不能git教程出现部分成功部分失利二进制八进制十进制十六进制转化的状况。

可是,LitePal 之前却从来没有供给过对外的业务接口,可是宽广开发者却实实在在会有业务方面的需求。

举个最常见的业务比方,你正在开发一个转账功用,需求先从一个账户中减去先必定的金额,然后向另一个账户二进制计算器中增业务文书加相同的金额。整套操作必须确保是原子性的,即要么一起成功,要么一起失利。假定部分成功的话,转账之后,账户的总金额就对不上了。

为此,LitePal 3.1.1 版别傍边总算参加了业务接口的支撑,并且用法也接口是什么十分简略,由于和 SQLiteDatabase 中供给的业务接口用法是几乎一致二进制的。

业务局咱们要进行一套数据库操作,并且要确保它们要么一起成功,要么一起失利,这个时分就能够这样写:

try {
LitePal.beginTran接口自动化saction();
boolean result1 =业务的四个特性
boolean resul二进制转化器t2 =
boolean result3 =
if (result1 && result2 && result3) {
LitePal.setTransactionSuccessf接口crc过错计数ul();
}
} finally {
LitePal.endTransaction();
}

能够看到,这儿调用 beginTransaction 办法来打开业务,调用 endTransaction 办法来结束业务,中心悉数的数据库操作公积金都是在业务傍边的。假定悉数的操作都成功了,那么咱们能够在结束业务之前调用一下 setTransactionSuccessful 办法,这样悉数的操作就都收效了。否则的话,悉数的操作都会被回滚,就好像什么都没产生过相同。

业务的用法便是这么简略,可是在 Kotlin 傍边,业务的用法会愈加简略,由于我又供给了一个 Kotlin 专属的业务 API,写法如下:

L二进制计算器itePal.runInTransaction {
val result1 =
val resul接口测验t2 =
val result3 =
result1 && result2 && rgitlabesult3
}

我来简略解释一下,咱们能够给 runInTransaction 办法传入一个 Lambda 表达式,表达式中的悉数代码就都是在业务傍边作业的接口卡了,这种语法特性是运用 Kotlin 的高阶函数功业务的四个特性用结束的。关于高阶函数前次我工商管理在直播的时分介绍得很具体,《第三行代码》也对这部分内容做了十分全面的解说。

giti Lambda 标明式的最终一行要求回来一个布尔值,用于标识是否悉数数据库操作都成接口是什么功了,只需回来 true 的时分业务中的数据库操作才会收效,回来 false 或者半途产生失常悉数的操二进制亡者列车作都会被回滚。

以上便是关于 LitePal 3.1.1 版别更新的悉数内github中文官网网页容,不过本篇文章是写给现已有 LitePal 根底的人看的,协助他们快速宫颈癌前期症状地晋级到 3.1.1 版别。假定接口类型你之前并没有触摸过 LitePal,那么能够阅览我写的技能专栏《Android 数据公积金库高手秘籍》,里边有二进制计算器十分翔实的 LitePal 运用解说。

LitePal 的开源库地址是:

github.com/LiteP接口文档alFram…

假定想要学习 Kotlin 和最新的 Android 常识,能够参看接口文档我的新书 《榜首行代码 第 3 版》接口crc过错计数点击此处查看概略。

重视我的技能大众号,每天都有优质技能文章推送。

微信扫一扫下方二维码即可重视二进制转化器

Android数据库高手秘籍(十一),LitePal支撑业务功用了

发表评论

提供最优质的资源集合

立即查看 了解详情