当前位置: 首页 > 工具软件 > Sugar Oshi > 使用案例 >

Sugar ORM使用误区

姚实
2023-12-01

最近在项目里使用了sugar这个框架,使用很简单,但是个人的失误和不注意,导致在一个问题上花费太多的时间,特此记录。

Github地址(https://github.com/satyan/sugar);官方文档地址(http://satyan.github.io/sugar/)

1,关联信息的存储

假设业务类A,B;A与B为一对多关系
public class A extends SugarRecord{
List<B> bList;
}

public class B extends SugarRecord{
A a;
}
要存储A,B,依据官网介绍,必须先存储A,再存储B。存储B时注意,新建一个B实例时要传入一个A示例a作为参数,作为参数的a,必须是从数据库里查找的A实例
比如:
A a = new A();
a.save(); //存储a
B b = new B(a);
b.save();//注意这种方式,a,b无法关联

//正确方式
a = A.find();
B b = new B(a);
b.save();//这样才能关联a,b

原因是,sugarORM建的表所储存的记录都有条id(废话),表B中A字段所存储的信息其实是表A中某条记录的id;
上述的错误方法中,实例a的自父类继承的属性id为空,执行save()方法后才会分配id,但是实例a并未被修改,所以id属性仍为空;存储b时,b的属性A的值为空;a与b并未关联。从数据库中查询得到的a的id属性为数据表中对应记录的id值,不为空,所以a与b才能关联。

2,update()的使用

其中sugar中update()这个方法与我所期望的不一样,使用前要确定表的唯一值,这点不说了。

之前我给一张表(比如表C)指定了两个唯一值,从数据库得到一条记录c;更新一个属性得到c1;执行c1.update(),目的是更新记录c为记录c1,但是执行后后发现整个表都被更新了,整个表只剩c1记录。

查看了官网,发现正确的更新方法如下:

Update Entity:

Book book = Book.findById(Book.class, 1);
book.title = "updated title here"; // modify the values
book.edition = "3rd edition";
book.save(); // updates the previous entry with new values.
本人也更新过其他只有一个唯一值的表记录,结果如我所愿的更新了。

原因我猜测如下,执行没有id值的实例的update()方法时,表会新增一条记录,如果实例有id值,整个表都会更新。


 类似资料: