实战LitePal(Android_Persistent Technology)

本文介绍LitePal,一款轻量级的Android数据库框架。通过对象关系映射(ORM),开发者无需编写SQL语句即可完成数据库操作。文章详细讲解了LitePal的安装配置、数据库创建与升级、数据增删改查等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LitePal是GitHub上一款开源的Android数据库框架。LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表、増删改查的操作。并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别。目前LitePal的源码已经托管到了GitHub上。   


主要内容:


0.准备工作(布局)

1.配置LitePal
2.创建和升级数据库
3.使用LitePal添加数据
4.使用LitePal更新数据
5.使用LitePal删除数据
6.使用LitePal查询数据


参考文献:《第一行代码(第2版)》!!!

相关Debug参考文章:

1.Debugexperience about SQLite & LitePal:创建数据库闪退?注意小括号

2.Android Device Monitor--File Explorer 中的/data/data/..无法访问的问题


步骤概要:


0.准备工作

        布局这边,准备好几个Button:

9125154-540aaba7c676a897.png


9125154-c99fb742677fd5c4.png
1.配置LitePal

1.1.编辑app/build.gradle文件

即添加依赖:compile'org.litepal.android:core:1.4.1'

9125154-bd54d6b1f2008d88.png


1.2.右击main目录,创建assets目录,在下面新建一个litepal.xml文件


9125154-de63055e543d0119.png

编辑litepal.xml文件的内容:

<dbname>标签用于指定数据库名;

<version>标签用于指定数据库版本号(初始设置为1);

<list>标签用于制定所有的映射模型(将class映射成为SQL数据库);


9125154-b3fb8eae0cd40481.png

1.3.在AndroidManifest.xml 中将application配置为"org.litepal.LitePalApplication",这样才能让LitePal所有功能都可以正常工作:

9125154-b954dcd75690fc43.png




2.创建和升级数据库

2.1.新建一个Book类(面向对象的Java类将会被映射成一个关系型数据库表):

生成Getter 和Setter的技巧 :

        先写好“id”“author”“price”等属性字段,然后按下Alt+Insert键,

        在弹出的菜单中选择Getter and Setter,接着使用shift键将所有字段都选中,最后点击OK;

9125154-f5e9ebdc468c5685.png


9125154-1047f36f0387d627.png


2.2在litepal.xml中用<mapping>标签生命我们要配置的映射模型类

9125154-9b09d9ef01527210.png
9125154-7c544ea0a1b383b3.png


2.3进行任意一次数据库的操作,BookStore.db就会自动创建出来:

        onClick()方法  中的  LitePal.getDatabase()方法  就是一次最简单的数据库操作:

9125154-c89b71ef010679a6.png

这个时候:

        a.创建数据库:我们先运行一下程序,然后点击 Create database 按钮;

        b.检查数据库创建情况: 接着打开cmd,输入adb shell,回车,cd进入数据库目录(  数据库文件会存放在/data/data/<package name>/databases/目录下  ),使用 ls 指令,可以看到数据库文件已经创建成功了;

这里可能会出现Android Device Monitor--File Explorer 中的/data/data/..无法访问的问题,那么我已经将自己的调试过程在这里记录下来了,可以的话方便参考一下;


9125154-9ce3bfd5627c2adf.png

        c.接下来我们使用sqlite3命令打开BookStore.db文件(  sqlite3+空格+数据库名称.db即可  ),然后再使用.schema命令查看建表语句:

9125154-b682f718985bbd93.png

            book表就是根据我们定义的Book类以及类中的字段来自动生成的;

2.4.升级数据库:只要改你想改的内容,然后将版本号加1就行了;

        a.比如在Book表中添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段即可:


9125154-b93ab392dab9564c.png

        b.再添加一个Category表,这时候只需要新建一个Category类就可以了:

9125154-d3c747559de88f30.png

        c.随后,在litepal.xml中做两件事:修改version(value加一),在<list>中添加映射模型类;即可:


9125154-0cd4eb9974a95347.png

        d.这时候运行一下程序,然后再点击 Create database 按钮,随后去sqlite查看建表语句即可查证;



3.使用LitePal添加数据

3.1.LitePal进行表管理操作时不需要模型类(如Book类)有任何的继承架构,但是进行CRUD操作时就不行了,必须要继承自DataSupport类才行:

3.2.添加数据:

        a.创建一个Book类的实例;

        b.调用Book类中的各种(我们一开始写好的)set方法  对数据进行设置;

        c.调用  save()方法  就能完成数据添加工作了:

9125154-35bcc4b2f5ab7d7a.png

        d.运行一下程序,然后再点击 ADD DATA 按钮,随后去sqlite查看建表语句即可查证;打开BookStore.db,输入SQL查询语句select * from Book:


9125154-6cd6b0c5beaae158.png

        可以看到,各种数据都被准确无误的添加成功了;



4.使用LitePal更新数据

4.1.如下图,第二次调用  save()方法  的时候(对照下图第47--50行),LitePal会发现当前的Book对象是已存储的,因此不会再向数据库中去添加一条新数据,而是会直接更新当前的数据:

9125154-7f80873fa4b9e01e.png


4.2.现在重新运行一下程序,然后点击 Update data 按钮,我们再次输入查询语句查看表中的数据情况:

9125154-48bd7e2b9af948f9.png

可以见到Book表新增了一条书的数据,但这本书的价格并不是一开始设置的19.95.而是10.99,说明我们的更新操作确实生效了;


4.3.但是这种更新方式只能对已存储的对象进行操作,限制性比较大,接下来学习另外一种更加灵巧的更新方式:

9125154-05f5618a5eb10458.png

        a.new一个Book的实例;

        b.调用连个set方法来设置需要更新的数据;

        c.调用updateAll()方法去执行更新操作;

        注意:updateAll()方法中可以指定一个条件约束,和SQLiteDatabase中的update()方法中的where参数部分有点类似(  ?是占位符,由后续对应位置的参数进行填充  ),但更加简洁,!!!如果不指定条件语句的话,就表示更新所有数据!!!

        这里我们指定书名为The Lost Symbol并且作者是Dan Brown 的书价格更新为14.95,出版社更新为Anchor;


4.4.运行程序,然后点击 Update data 按钮,我们再次输入查询语句查看表中的数据情况:

9125154-7a2583f027b96685.png


拓展:了解setToDefault()方法



5.使用LitePal删除数据

5.1. 调用 DataSupport.deleteAll()  方法  来删除数据,第一个参数用于指定删除哪张表中的数据,Book.class就意味着删除Book表中的数据,后面的参数用于指定约束条件;

注意:同样的,类似于updateAll(),如果不指定约束条件如 —— DataSupport.deleteAll(Book.class) ;,意味着你要删除表中的所有数据;

9125154-ef56e47a9318ba8b.png


5.2.运行程序,然后点击 Delete data 按钮,我们再次输入查询语句查看表中的数据情况:

9125154-2c484e2131b3413c.png




6.使用LitePal查询数据

6.1.

        a.通过调用 findAll() 方法,然后通过Book.class参数指定查询Book表就可以;

        b.findAll()方法的返回值是一个Book类型的List集合,也就是说我们不用像Cursor对象一行行去取值了,LitePal已经自动帮我们完成了赋值操作;

        c.拓展  findFirst   findLast  方法:

9125154-72e54c6eba4e18bd.png

6.2.

为了便于观察,我们增加成两行数据:

9125154-94a421d248f56cae.png


运行程序,然后点击 Query data 按钮,然后查看logcat的打印内容:

9125154-5ae43e44384a3e14.png

6.3.拓展:查看API或《第一行代码》,了解LitePal的  select()  ,  where()  ,  order()  ,  limit()  ,  offset()  等查询方法以及连缀使用。


总结:LitePal将面向对象的语言和面向关系的数据库之间建立了一种映射关系,使用了LitePal,我们就可以用面向对象的思维来实现同面向关系的数据库一样的功能了,十分魔法和痛快!

补充:

1.模型类映射为关系型表;类的属性变量即为表的列;

2.模型类中的属性变量可以在实例化之后用来暂时存储数据;

3.模型类的get和set方法则用来对模型类中的属性值进行操作。

### ATTR_PERSISTENT 的定义及用法 在编程领域中,`ATTR_PERSISTENT` 是一种常用于数据库连接或其他资源管理场景中的属性标志。它的主要作用是创建持久化连接或对象实例,从而减少重复初始化的成本并提高性能。 #### 数据库上下文中 `ATTR_PERSISTENT` 当提到 `ATTR_PERSISTENT` 时,最常见的应用场景是在数据库驱动程序中设置持久化连接选项。例如,在 PHP 中使用 PDO(PHP Data Objects)扩展时,可以通过传递该属性来启用持久化连接功能: ```php $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_PERSISTENT => true // 启用持久化连接 ]; try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password', $options); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); } ``` 上述代码片段展示了如何通过将 `PDO::ATTR_PERSISTENT` 设置为 `true` 来建立持久化的数据库连接[^5]。这种方式可以显著降低频繁重新打开数据库连接所带来的开销,尤其是在高并发环境下。 #### 文件映射与内存操作中的潜在关联 尽管 `ATTR_PERSISTENT` 主要应用于数据库交互层面,但在某些特定情况下也可能涉及文件系统的高效访问模式。比如利用 mmap 技术加载文件到内存后执行 load/store 操作时,如果希望保持数据一致性,则可能需要类似的机制配合 msync 或 fsync 调用来同步更改至磁盘[^3]。不过这种情况下的具体实现细节会因平台而异,并不直接依赖于标准意义上的 `ATTR_PERSISTENT` 参数。 #### 解释器环境的影响因素考量 考虑到解释型语言运行效率较低这一特性[^4],采用诸如持久化连接这样的优化手段显得尤为重要。因为它们能够有效缓解由于反复解析脚本源码所引发的时间损耗问题,进而提升整体应用表现水平。 ### 总结 综上所述,`ATTR_PERSISTENT` 在大多数情形下是用来指示是否应该维持长期有效的链接或者其他形式的资源共享状态的关键字之一;它有助于改善那些存在大量短时间请求处理需求的应用程序架构设计质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值