LitePal框架是郭神的开源框架,郭神博客
先膜拜一下郭神。从本篇开始,开播郭神的LitePal框架的CURD操作。
想要利用LitePal框架使得实体类具有CURD的功能,那么就要先让实体类继承DataSupport这个类。
本篇主要演示插入功能。
以实体类News举例
package org.guya.litepaltest.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.litepal.crud.DataSupport;
public class News extends DataSupport {
private int id;
private String title;
private String content;
private Date publishDate;
private int commentCount;
private List<Comment> commentList = new ArrayList<Comment>();
private List<Category> categoryList = new ArrayList<Category>();
...
}
代码里只是让实体类继承了DataSupport类,其他啥都没做,so easy!
接下来,我们来演示一下往News表里插入一条数据。
/**
* 往News表里插入第一条数据
*/
private void addMyFirstNews() {
News news=new News();
news.setTitle("this is my first news's title");
news.setContent("this is my first news's content");
news.setPublishDate(new Date());
news.save();
}
然后去onCreate()里调用,别忘了更新一下版本号,因为我们修改了实体类,让其有了新的继承。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase db = Connector.getDatabase();
addMyFirstNews();
}
下面来看一下结果。
这里做一下说明:想在某某表里插入一条记录,首先利用其实体类创建出该实体类对象,然后通过调用setXXX方法来设置表内数据,最后调用save方法保存。
保存成功以后,LitePal会自动为该记录的id赋值到实体id上,以后我们想要调用这个记录的时候,使用其id即可。
注意:save方法的返回值是布尔型的,插入成功返回的是true,否则是false。如果想要在插入记录失败的时候抛出异常,那么在保存记录的时候,请使用saveThrows(),在插入失败的时候会抛出DataSupportException异常。
下面演示表关联
(一)1:1
前面我们介绍了,News表和Introduce表是一对一的关系,一个新闻含有一个介绍,我们可以这样写。
/**
* 往News表的一条新闻,对应一个介绍
*/
private void addNewsAndIntroduce() {
News news2=new News();
news2.setTitle("我是一个新闻标题");
news2.setContent("我是一个新闻内容");
news2.setPublishDate(new Date());
news2.save();
Introduce i=new Introduce();
i.setContent("我是一个介绍哟");
i.setNews(news2);
i.save();
}
然后在onCreate()方法里调用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase db = Connector.getDatabase();
//addMyFirstNews();
addNewsAndIntroduce();
}
下面给出效果图
(二)1:N
前面我们介绍了,News表和Comment表是1:N的关系,一个新闻可以有多个评论,一个评论只属于一个新闻。
我们可以用代码这样来描述,如下:
/**
* 演示News表和Comment表的1:N关系
*/
private void addNewsAndComments() {
Comment c1 = new Comment();
c1.setContent("我是评论1");
c1.setPubDate(new Date());
c1.save();
Comment c2 = new Comment();
c2.setContent("我是评论2");
c2.setPubDate(new Date());
c2.save();
Comment c3 = new Comment();
c3.setContent("我是评论3");
c3.setPubDate(new Date());
c3.save();
News news3 = new News();
news3.setTitle("我是第三个新闻标题啦啦啦啦");
news3.setContent("我是第三个新闻的内容啦啦啦");
news3.setPublishDate(new Date());
news3.getCommentList().add(c1);
news3.getCommentList().add(c2);
news3.getCommentList().add(c3);
news3.save();
}
然后在onCreate()方法里调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase db = Connector.getDatabase();
// addMyFirstNews();
// addNewsAndIntroduce();
addNewsAndComments();
}
效果图如下:
(三)N:N
前面我们介绍了News表和Category表是满足N:N关系的,即一个新闻可能属于多个目录,一个目录里可能含有多个新闻。
下面我们用代码来演示一下。
/**
* 演示News表和Category表的N:N关系
*/
private void addNewsAndCategories() {
News news1 = new News();
news1.setTitle("1");
news1.setContent("1.1");
news1.save();
News news2 = new News();
news2.setTitle("2");
news2.setContent("2.1");
news2.save();
News news3 = new News();
news3.setTitle("3");
news3.setContent("3.1");
news3.save();
News news4 = new News();
news4.setTitle("4");
news4.setContent("4.1");
news4.save();
Category c1 = new Category();
c1.setName("社会新闻");
c1.getNewsList().add(news1);
c1.getNewsList().add(news4);
c1.save();
Category c2 = new Category();
c2.setName("娱乐新闻");
c2.getNewsList().add(news1);
c2.getNewsList().add(news2);
c2.save();
Category c3 = new Category();
c3.setName("军事新闻");
c3.getNewsList().add(news3);
c3.save();
}
然后在onCreate()里调用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase db = Connector.getDatabase();
// addMyFirstNews();
// addNewsAndIntroduce();
// addNewsAndComments();
addNewsAndCategories();
}
效果图如下:
自此,LitePal的存储演示完毕。啦啦啦