litepal ORM框架

LitePal是GitHub上一款开源的Android数据库框架。使用LitePal的好处就是对象即为表,只需在XML文件中配置好,就可以像是操作对象一样操作表.


首先献上litepal的下载地址():https://github.com/qibin0506/LitePal

下面分段开始我们的litepal之旅吧。

1、建表

数据库操作,上来肯定是要建表啊。虽然android原生的SQLiteOpenHelper很强大, 但还是得自己去写sql语句, 看看litepal是怎么搞定的:

找到你下载的litepal的downloads目录,将litepal-1.1.1-src.jar复制到你工程的libs目录, 这还没完,还需要小小的配置一下: 打开manifest文件给application节点配置“android:name="org.litepal.LitePalApplication"”。

既然是ORM框架,那肯定需要我们写几个实体类,实体类的类名对应数据库的表的名称,字段对应了数据库中的字段:


public class Person extends DataSupport {
	private int id;
	private String name;
	private String gender;
	private List<Phone> phones = new ArrayList<Phone>();

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public List<Phone> getPhones() {
		return phones;
	}

	public void setPhones(List<Phone> phones) {
		this.phones = phones;
	}
}


public class Phone extends DataSupport {
	private int id;
	private String phoneNumber;
	private Person person;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getPhoneNumber() {
		return phoneNumber;
	}

	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
}

两个实体类, 说明一下: 

(1) Person中有个List<Phone>和Phone中有个Person表示Person和Phone是1:n的关系, 用litepal就是这么简单的,很轻松的就搞定了表之间的关系,废话一句:我可以说我之前很少用关联表嘛。。。

(2) 实体类继承了DataSupport, 这个类是LitePal中的一个类, 后面它会给我们带来惊喜。

很轻松的搞定了两个实体类,而且注明了之间的关系,接下来还需要一个xml文件来声明它们,要让litepal知道这两个类是要映射到数据中的。

在assert目录创建litepal.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="easydb" />
    <version value="1" />
    <list>
  		<mapping class="org.loader.litepaltest1.Phone" />
  		<mapping class="org.loader.litepaltest1.Person" />
    </list>
</litepal>

简单的说明一下:dbname是指定数据库名称,这里不需要加.db哦。 version不用想也知道是指定数据库的版本了(那是不是以后修改数据库版本只要该这个值就可以了? 嘿嘿, 必须就是这么简单),还有个list,list节点下有两个mapping仔细观察原来是声明的我们刚开始建立的那两个实体类。


好了,建表这一步就完成了, 只要你的代码有数据库操作, 建表就会自动完成。


2、插入数据

表建立完了, 下一步当然是插入数据了, 马上就会就是litepal对我们的第一次震撼。

Person p = new Person();
p.setName("person1");
p.setGender("male");
p.save();
		
Phone phone1 = new Phone();
phone1.setPerson(p);
phone1.setPhoneNumber("123456");
phone1.save();
		
Phone phone2 = new Phone();
phone2.setPerson(p);
phone2.setPhoneNumber("456789");
phone2.save();

在不知不觉中你已经向Person表中插入了一条数据, 向phone表中插入了2条数据,phone表中的2条数据和person表中那条数据是用对应关系的。我现在要加个表情!!!(可是不知道怎么加。。)如此简单的操作,就是实现了insert操作,让我怎么能不爱上它呢? 但还是要注意一下set完数据别忘了save()一把,save()方法哪来的? 别忘了我们的实体类继承自DataSupport。


3、更新

插入如此简单, 那更新也肯定很简单。

3.1 使用ContentValues更新特定id的数据:

ContentValues values = new ContentValues();
values.put("name", "newname");
DataSupport.update(Person.class, values, 1);

这段代码将id为1的person的name修改为newname,注意update方法是DataSupport中的一个静态方法。

3.2 使用ContentValues更新特定条件的数据:

ContentValues values = new ContentValues();
values.put("phoneNumber", "11111");
DataSupport.updateAll(Phone.class, values, "id>?", "1");

将id>1的phone的phonenumber修改为11111。

要修改全部数据:

DataSupport.updateAll(Phone.class, values);

不多说了, 一目了然。

如果不习惯使用ContentValues呢? 好办litepal还提供了更加方便的更新操作

3.3 优雅的更新特定id的数据

Phone updatePhone = new Phone();
updatePhone.setPhoneNumber("147852");
updatePhone.update(1);

这里调用对象上的update方法将id为1的phone的phonenumber更新为147852,这种方式是不是有一次震撼到你了? 我是在课堂上看到litepal, 反正当时我是笑出声来了。

3.4 优雅的更新特定条件的数据

Phone updatePhone = new Phone();
updatePhone.setPhoneNumber("256333");
updatePhone.updateAll("id>?", "2");

不多说了, 更新id>2的所有数据。注意一点是这里调用了updateAll方法

3.5 优雅的更新所有数据

Phone updatePhone = new Phone();
updatePhone.setPhoneNumber("111111");
updatePhone.updateAll();

额, 不想多说了, 肯定很清晰。


4、删除

现在你肯定也想到了删除操作是如何简单了吧, 不过我们还是贴一下吧。

int deleteCount = DataSupport.delete(Person.class, 1);
System.out.println(deleteCount);

删除id为1的person, 这里要多说几句了, 不就删除id是1的person么? 肯定就是1条啊, 获取count是多余的吧? 嘿嘿, 再次证明一下litepal的强大吧, 删除一条数据, litepal会把与该数据关联的其他表中的数据一并删除了,比如现在删除了id为1的Person, 那Phone表中属于Person的数据将全部被删除!! 毕竟那些成为垃圾数据了。

DataSupport.deleteAll(Person.class, "id>?", "1");
DataSupport.deleteAll(Person.class);

这是按条件删除,没什么好说的。


5、查询

sql语句中最复杂的就是查询了,尤其是多表联合查询(我可以说我现在都不会吗?),但是litepal做其他确是如此简单!!

5.1 震撼的级联操作

List<Phone> phones = DataSupport.where("id>?", "1").order("id").limit(3).find(Phone.class);
for(Phone p : phones) {
	System.out.println(p.getPhoneNumber());
}

!!!!! 这不就在thinkphp中的级联吗!!!我曾经因为做了一个java的这种级联操作类而感到自豪。

5.2 震撼的查询特定id的数据

Phone p = DataSupport.find(Phone.class, 3);
//DataSupport.find(Phone.class, 3, true);  // 关联的表也会查询出来
System.out.println(p.getPhoneNumber());

注意注释了的那句话,第三个参数如果设为true,则关联的表的数据也会被查询出来,强大不!! 那如何获取关联表的数据呢? 很简单p.getPerson().getName()


5.3 震撼的枚举查询(枚举查询是我给它起的名,可能不太确切,说白了就是sql语句的in)

List<Phone> phones = DataSupport.findAll(Phone.class, 3, 4);
//DataSupport.findAll(Phone.class,, true,  3, 4); // 关联的表也会查询出来
for(Phone p : phones) {
	System.out.println(p.getPhoneNumber());
}

同样注意注释了的那句话, 功能和前面的是一样的, 所有查询操作都会有这么一个重载的方法。


5.4 震撼的查询第一条数据

Phone phone = DataSupport.findFirst(Phone.class);
//DataSupport.findFirst(Phone.class, true);  // 关联的表也会查询出来
System.out.println(phone.getPhoneNumber());

查询第一条数据,妈妈再也不用担心我写错order by limit了。


Phone phone = DataSupport.findLast(Phone.class, true);
//Phone p = DataSupport.findFirst(Phone.class, true);
System.out.println(phone.getPhoneNumber());

查询最后一条数据, 不说了, 和上面一样。

5.5 除此之外litepal还给我们提供了一个可以“自由发挥”的方法,也就是自己书写sql语句

Cursor cursor = DataSupport.findBySQL("select * from phone where id=?","3");
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) {
	System.out.println(cursor.getString(cursor.getColumnIndex("phonenumber")));
}
cursor.close();

你可能感兴趣的:(litepal ORM框架)