Android的LitePal数据库ORM使用总结(避坑指南)

简介: Android的LitePal数据库ORM使用总结(避坑指南)

LitePal是Android《第一行代码》作者郭神的开源ORM框架,一个很好用的ORM。


虽然好用,但是如果不加注意,会遇到很多坑。所谓坑,并不是说框架不好,只是说有一些细节注意不到可能会犯错。


这不是bug,但是教程也好,示例demo中也罢,很少有提到,只能在使用过程中一一总结了。


以下总结自己使用中遇到的问题,逐步完善。


先介绍下简单使用:


app目录下的build.gradle中增加依赖:


//litepal数据库ORM
implementation 'org.litepal.guolindev:core:3.2.3'


在assets文件夹下创建一个相应的litepal.xml文件夹::


<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="testdb"/>
    <version value="1"/>
    <list>
        <mapping class="com.test.model.User"/>
    </list>
   <storage value="mydir" />
</litepal>


在Application的onCreate中,增加初始化:LitePal.initialize(this);引入完毕。


问题一:


默认的数据库存储位置问题,可在litepal.xml文件中指定storage value="external"或者 "internal",默认是internal,文件浏览器查看是不可见或无权限的。external则在Android/data/目录下能找到数据库文件。但是,无论设置为哪种,只要应用卸载,数据库就跟着清除掉了。


如何能够持久保留数据库文件,不受是否卸载的影响呢?也简单,改下storage即可。


如:storage value="mydir" ,就会在根目录下的mydir目录下找到数据库文件。但前提是这个mydir已经提前创建好吧,若未创建会怎样,试下就知道。


问题二:


多表关联问题,关联的表无法存入数据。


这里有个隐藏的秘密,很难发现。建立一对一关联或一对多关联后,首先你要记得把关联表的数据save!!并不是你直接把数据set赋值之后,关联表就有数据了。set只是给两个表建立关联的。并且,除了save外,那个set也一样不能漏,否则你会看到关联的表里那个外键字段内容为空。


正解如:


News news=new News();
        news.setTitle("这是一条新闻标题");
        news.setContent("这是一条新闻内容");
        news.setPublishDate(new Date());
        Introduction introduction=new Introduction();
        introduction.setGuide("这是新闻导语");
        introduction.setDigest("这是新闻摘要");
        news.setIntroduction(introduction);//只是建立关联
        introduction.save();//重点
        news.save();


问题三:


有多表关联的实体,查询时查出来的关联的表内容为空。


比如定义了一个实体,内部还关联了其他实体类。查询时如果不加注意,只能查到本实体的内容,关联的实体查到的为空。


举例如:


public  class OrderDishTransdtlRecord extends LitePalSupport {
    @Column(nullable = false)
    private String billno;// 点餐单号
    @Nullable
    private String goodsid;//菜品编号 char(16)
    @Nullable
    private String typename; //菜品类别名称
    private int orderno;// 每笔订单菜品序列号
    private int price;
    private int qty;
    @Column(ignore = true)
    private List<OrderComboFoodRecord> comboFoods;// 套餐详情,不存数据库
    private  List<OrderDishTransdtlRecord> dtlList;// 细节  关联OrderDishDtlRecord
.....
}


如果只是想当然的  LitePal.find(OrderTransdtlRecord.class,10),这样查到的dtlList为null,没有数据。而应该如下写法:


 OrderTransdtlRecord recc = LitePal.find(OrderTransdtlRecord.class,10,true);//重点,第三个参数必须有,且为true
 Log.d(TAG,recc.toString());


问题四:


删除一条记录,关联的表里内容本该跟着删除的,但是数据还在,删除不掉的问题。如:


 OrderTransdtlRecord recc = LitePal.find(OrderTransdtlRecord.class,10);
 recc.delete();


这样是删不掉OrderTransdtlRecord的关联表OrderDishTransdtlRecord中的数据的。原因跟上个类似,这里的查询没增加第三个参数,isEager:True to load the associated models, false not.加上第三个参数,查询成功后,再删除,这样关联表才会跟着删除。或者使用这种方式,LitePal.delete(OrderTransdtlRecord.class,18),关联表会跟着删除。


或者使用这种方式,关联的表也会随之删除:


LitePal.deleteAll(OrderTransdtlRecord.class,"id = ? ","19");


问题五:


LitePal中不支持枚举类型。如果你的model里使用了枚举类型,在生成的表结构里枚举类型的字段会被忽略。


常用的类型如String和int,long可以放心用,其他类型需做好测试,不能想当然。


LitePal支持的数据类型有8种,分别为:int、short、long、float、double、boolean、String和Date。其他不支持的如枚举,会被忽略。


并且,如果里面使用了表关联,需在litpal.xml中注册,否则,也会被忽略,而非生成关联的表结构。


在进行boolean类型操作的时候也需要注意。对于LitePal数据库,存储boolean值为true的时候可以直接用LitePal存储对象的方式存储,若存储的对象中boolean为false,需要调用setToDefault(String name)方法存储,其中参数name为对象中Boolean属性的名称,为字符串boolean值其实是以0和1的方式存到数据库中的,true=1,false=0,所以在查询的时候需要注意。


问题六:


LitePal数据库的操作,默认是在主线程中的,使用时需注意自己处理线程和异步问题。


虽然之前版本LitePal提供的有异步操作api,但是作者说了,尽量少用。后续版本可能废弃不再维护。推荐应用开发者自己处理异步问题,如使用RxJava异步库。


问题七:


LitePal不能更改数据库表名和字段名。默认的表名就是定义的实体类的类名,且都为小写,字段名都是实体类中定义的属性的小写。


问题八:


LitePal不支持自定义主键,默认的主键为id,不管一个实体类对象有没有设置id字段,数据库的表中都会创建一个id的主键,而这个id的值会在新记录插入时被自动置为表中的Id,也即是唯一值。如果你里面定义了个String id,运行会报错的。


问题九:


升级表结构时要格外注意,以防历史数据被清空。以下一些升级情况LitePal无法处理并且被升级表格里的所有数据将被清空:


添加了一个标注为 unique = true 的属性;


修改某个属性的标注为 unique = true;


修改某个属性的标注为 nullable = false;


以上情况会导致数据丢失,要格外注意。


相关文章
|
3月前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
98 2
|
4月前
|
SQL 开发框架 数据库
".NET开发者的超能力:AgileEAS.NET ORM带你穿越数据库的迷宫,让数据操作变得轻松又神奇!"
【8月更文挑战第16天】AgileEAS.NET是面向.NET平台的企业应用开发框架,核心功能包括数据关系映射(ORM),允许以面向对象方式操作数据库,无需编写复杂SQL。通过继承`AgileEAS.Data.Entity`创建实体类对应数据库表,利用ORM简化数据访问层编码。支持基本的CRUD操作及复杂查询如条件筛选、排序和分页,并可通过导航属性实现多表关联。此外,提供了事务管理功能确保数据一致性。AgileEAS.NET的ORM简化了数据库操作,提升了开发效率和代码可维护性。
58 5
|
25天前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
3月前
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
|
2月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
86 0
|
4月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
65 1
|
4月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
343 0
|
4月前
|
数据库 Java 数据库连接
玩转Play Framework的秘密武器:Ebean ORM带你解锁高效数据库操作新姿势,让你的代码从此飞起来!
【8月更文挑战第31天】Play Framework 以其简洁的 API 和高效开发体验著称,Ebean ORM 则是其推荐的对象关系映射(ORM)工具之一。Ebean 可将 Java 对象轻松映射到数据库表,简化数据库交互。本文将指导你在 Play Framework 中使用 Ebean ORM 进行数据库操作,涵盖项目创建、依赖引入、数据库配置、模型定义及 CRUD 操作,并通过示例代码展示实现过程。通过这些步骤,你将学会如何利用 Ebean 的丰富功能,如事务管理、查询构建等,提升 Web 应用的数据库交互能力。
82 0
|
4月前
|
数据库 测试技术 开发者
Play Framework的测试魔法:让代码在舞台上翩翩起舞,确保应用质量的幕后英雄!
【8月更文挑战第31天】Play Framework不仅以其高效开发与部署流程著称,还内置了强大的测试工具,提供全面的测试支持,确保应用高质量和稳定性。本文将详细介绍如何在Play Framework中进行单元测试和集成测试,涵盖`WithApplication`、`WithServer`及`WithDatabase`等类的使用方法,并通过示例代码手把手教你如何利用Play的测试框架。无论是单元测试、集成测试还是数据库操作测试,Play Framework均能轻松应对,助你提升应用质量和开发效率。
53 0