尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LitePal数据库框架实战指南:从零手写一个音乐App,彻底告别手写SQL

LitePal数据库框架实战指南:从零手写一个音乐App,彻底告别手写SQL LitePal数据库框架实战指南从零手写一个音乐App彻底告别手写SQL【免费下载链接】LitePalAn Android library that makes developers use SQLite database extremely easy.项目地址: https://gitcode.com/gh_mirrors/li/LitePal凌晨两点的会议室里实习生小张盯着Logcat里那一长串sqlite database is locked报错发呆——他只是想往本地SQLite里插一条专辑记录却要手写CREATE TABLE、拼ContentValues、处理SQLiteOpenHelper的版本升级回调一不留神还把自己线上用户的数据表结构改崩了。如果你也经历过这种写业务五分钟调数据库两小时的翻车现场那么这篇文章介绍的LitePal数据库框架就是为你准备的解药一个配置文件、几行注解、链式查询SQLite从此变成对象的事不再是你的事。为什么说没有LitePal的日子像用手工账本管库存在认识LitePal之前Android原生数据库开发普遍踩过下面这些坑。你可以对照一下看看自己中了几个过去手写SQLiteOpenHelper重写onCreate和onUpgrade每次改表结构都要小心翼翼地写ALTER TABLE一旦写错整张表数据清零。现在改一行Java/Kotlin模型类litepal.xml里版本号加1框架自动帮你建表、加列、删列老数据自动保留。过去新增一条数据要先new ContentValues()再一行行put字段最后db.insert()字段一多手都麻了。现在model.save()一行搞定关联对象比如专辑下的歌曲列表还会自动级联保存。过去查数据要写Cursor遍历、手动getColumnIndex稍不留神索引写错就崩。现在LitePal.findAll(Album.class)直接返回对象列表链式where().order().limit()想怎么组合就怎么组合。过去异步操作要自己开线程、发Handler事务要自己beginTransaction到endTransaction一整套。现在LitePal.runInTransaction {}一个代码块保证原子性多数据库切换只需两行。能力全景LitePal各功能模块能帮你做什么核心功能能力说明典型应用场景上手难度自动建表与升级根据模型类自动生成表结构改模型即改表应用首版建表、后续迭代加字段⭐ 极低配好即用CRUD封装继承LitePalSupport获得save()等方法所有数据的增删改查⭐ 极低流畅查询Fluent Querywhere/order/limit链式组合条件列表筛选、排序、分页⭐⭐ 低关联映射支持一对一、一对多、多对多自动建关联表歌手-专辑-歌曲等嵌套业务模型⭐⭐⭐ 中等多数据库管理运行时动态创建、切换、删除多个库多账号、数据隔离场景⭐⭐ 低事务处理原子性提交或回滚批量写入、转账等强一致性操作⭐ 低字段注解与加密Column约束字段、Encrypt加密敏感字段唯一约束、索引、密码脱敏存储⭐⭐ 低实战主线用LitePal从零搭一个音乐收藏App光说不练假把式。下面我们就用LitePal做一个小而完整的音乐收藏App把上面表格里的功能全部串一遍。先定义三个模型歌手Singer、专辑Album、歌曲Song正好构成一对多关联。第1步集成依赖并配置litepal.xml在build.gradle里添加依赖dependencies { // 在项目的build.gradle中添加LitePal核心库依赖 implementation org.litepal.guolindev:core:3.2.3 }然后在assets目录下新建litepal.xml这是LitePal唯一的配置文件?xml version1.0 encodingutf-8? litepal !-- dbname数据库文件名不写.db后缀会自动补全 -- dbname valuemusic / !-- version数据库版本号每次改表结构就1 -- version value1 / list !-- mapping声明哪些模型类要建表一行一个类 -- mapping classcom.example.music.model.Singer / mapping classcom.example.music.model.Album / mapping classcom.example.music.model.Song / /list !-- storage数据库存放位置internal为应用私有存储external为外部存储 -- storage valueinternal / /litepal最后在AndroidManifest.xml里把Application换成org.litepal.LitePalApplication如果你的项目已有自定义Application就在它的onCreate()里调用LitePal.initialize(this)效果一样。第2步定义模型让Java对象变成数据库表参照项目sample中真实的Album.java写法模型类只需继承LitePalSupport并用注解声明字段规则public class Singer extends LitePalSupport { private long id; // 主键idLitePal自动管理 private String name; // 普通字段自动映射为name列 private int age; // int自动映射为integer类型 Column(unique true, defaultValue 未知歌手) private String stageName; // unique约束默认值重复会插入失败 Column(ignore true) private String tempCache; // ignoretrue表示不建列仅作内存缓存 private ListAlbum albums new ArrayList(); // 一对多歌手拥有多张专辑 }同样定义Album含Singer singer和ListSong songs和Song含Album album。这些关联字段LitePal会自动建立外键关联表你完全不需要写CREATE TABLE。小技巧Column(index true)可以给字段加索引查询该字段时会快很多适合经常作为查询条件的字段。第3步保存数据级联关联一步到位保存歌手和它的专辑只需要在关联对象上调用一次save()// 创建歌手对象直接set属性无需关心SQL Singer singer new Singer(); singer.setName(周杰伦); singer.setAge(42); singer.setStageName(Jay); singer.save(); // 插入singer表主键id自动生成 // 创建专辑并挂到歌手名下 Album album new Album(); album.setName(七里香); album.setPrice(20.99); album.setSinger(singer); // 建立外键关联album表会生成singer_id列 album.save(); // 创建歌曲并关联到专辑 Song song new Song(); song.setName(七里香); song.setDuration(268); song.setAlbum(album); // song表会生成album_id列 song.save();执行完这段代码你再去SQLite里翻song表会发现album_id已经自动填好了。插入3张表一条SQL都不用写这正是LitePal的核心价值。第4步查询数据链式调用组合条件查询是LitePal最惊艳的部分。查找一张专辑下的所有歌、按时长排序、分页取前20条// 链式查询专辑为七里香、时长小于300秒的歌曲按时长降序排列 ListSong songs LitePal.where(album_id ? and duration ?, 1, 300) .order(duration desc) // 排序字段desc表示降序 .limit(20) // 只取前20条 .find(Song.class); // 结果直接映射成Song对象列表 // 顺带查一下这张专辑 Album album LitePal.find(Album.class, 1); // 按主键id查找一条记录 // 统计这张专辑里歌曲数量 long count LitePal.where(album_id ?, 1).count(Song.class);如果是在Kotlin里语法甚至更简洁LitePal.where(...).order(...).limit(20).findSong()。第5步更新与删除同样不碰SQL// 更新按条件批量更新把某个歌手所有专辑的价格改掉 Album album new Album(); album.setPrice(15.99); album.updateAll(singer_id ?, 1); // 等价于 UPDATE album SET price? WHERE singer_id? // 删除按主键删除一条或按条件批量删除 LitePal.delete(Song.class, 10); // 删除id为10的歌曲 LitePal.deleteAll(Song.class, duration ?, 300); // 批量删除时长超过300秒的歌曲高手进阶3个不常见但极其实用的技巧用Encrypt注解给敏感字段加密存储。如果你的模型里存了手机号、身份证号这类敏感信息给字段加上Encrypt(algorithm AES)LitePal在写入时会自动加密、读取时自动解密数据库里存的永远是密文。这是很多新手完全不知道的隐藏能力。运行时动态切换多数据库。用LitePalDB litePalDB new LitePalDB(user2, 1); litePalDB.addClassName(...); LitePal.use(litePalDB);创建并使用第二个库LitePal.useDefault()切回默认库LitePal.deleteDatabase(user2)删除它——多账号数据隔离只需要这几行。用saveIfNotExist()做幂等写入。判断一个对象在数据库中是否已存在根据唯一约束不存在才插入避免重复数据。配合LitePal.runInTransaction { ... }事务块可以保证批量写入要么全部成功、要么全部回滚。避坑锦囊这些坑我替你踩过了升级数据库时给字段加unique true会清空整表数据。LitePal无法在保留数据的前提下给已有列加唯一约束所以它只能重建表。升级前一定要想清楚或者在测试机上先验证一遍。Column注解对主键id不生效。id列由框架托管别想着给id加unique或default写了也会被忽略。LitePal.initialize(this)务必传Application Context千万别传Activity或Service否则会内存泄漏。配置了LitePalApplication的话连这一步都省了。升级时改了cases大小写配置会导致 column not found 异常。这个值keep/lower/upper首次运行后就不要动了。旧版异步APIsaveAsync等已被废弃。官方建议异步操作自己用协程或线程处理别再用已标记Deprecated的方法。收尾行动现在就动手让数据库不再成为你的瓶颈看完这篇文章不妨给自己布置一个小任务用5分钟时间按上面的步骤集成LitePal创建一个只有一张表的记账本模型然后尝试保存、查询、更新各一次。你会发现整个过程的代码量比你想象中少一个数量级。如果遇到问题照着这三个问题自查一遍①litepal.xml是否放在assets目录且语法正确② 模型类是否继承了LitePalSupport③ Application是否已正确初始化80%的报错都源于这三点。更完整的模型定义、聚合函数count、sum、avg、一对一/多对多关联示例以及完整的单元测试用例都可以在项目sample模块中找到想深入源码可以从core模块的FluentQuery.java链式查询实现和tablemanager/Generator.java自动建表核心入手读完你会对自动建表的实现原理了然于心。好了把手动写SQL的时间省下来去打磨你的业务吧。你的第一个LitePal数据库现在就出发。关键词LitePal数据库框架、Android SQLite ORM、Android数据库操作、链式查询、LitePal自动建表、LitePal事务、LitePal多数据库、LitePal配置教程【免费下载链接】LitePalAn Android library that makes developers use SQLite database extremely easy.项目地址: https://gitcode.com/gh_mirrors/li/LitePal创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表