LitePal:
一、创建新数据库
导入依赖
implementation 'org.litepal.guolindev:core:3.1.1'
- 由于操作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样操作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需要整个项目使用的是LitePalApplication,所有的数据库操作就都不用再传Context了,直接使用当前对象即可,如下所示:
class MyApplication: LitePalApplication() {
}
然后在清单文件配置中的application标签中加android:name=".MyApplication"
2. LitePal采取的是对象关系映射(ORM)的模式,根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),也就是说,如果我们想要建一张news表,就应该有一个对应的News模型类。新建一个News类,如下所示:
data class News(var id:Int, var title:String, var content:String, var publishDate:Date, var commentCount:Int)
LitePal的所有映射都是自动完成的,无需编写映射文件,根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。
3. 编写配置文件:
添加assets目录下的litepal.xml文件
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--配置数据库名-->
<dbname value="demo"></dbname>
<!--配置版本-->
<version value="1"></version>
<!--加入模型类声明-->
<list>
<mapping class="com.example.ha.News"></mapping>
</list>
</litepal>
- 然后即可获取SQLiteDatabase实例,即可创建出对应数据库和表
val database = Connector.getDatabase()
二、更新数据库
- 好了现在数据库版本1已经有了,接下来我们更新数据库,添加新表:
data class Comment(var id: Int, var content: String)
- 添加模型、更改版本号+1:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo"></dbname>
<version value="2"></version>
<list>
<mapping class="com.example.ha.News"></mapping>
<mapping class="com.example.ha.Comment"></mapping>
</list>
</litepal>
然后再次执行val database = Connector.getDatabase()
更新表中的列后也只需修改版本号。
另外,如果想删除某一张表的话,操作也很简单,在litepal.xml中的映射列表中将相应的类删除即可。
多表关联操作
需要以下几个模型:
News(新闻) Introduction(新闻内容) Category (新闻种类)Comment(新闻评论)
- 关系:
- 新闻和新闻内容一对一,结论:
News
中需要包含Introduction
的依赖或者Introduction
中需要包含News
的依赖 - 新闻可属于多个种类,同时一个新闻种类下包含很多新闻,结论:
News
中包含List<Category>
的依赖,Category
包含List<News>
的依赖 - 每条新闻拥有多个评论,结论:
News
中包含List<Comment>
的依赖,Comment
中包含News
依赖
- 新闻和新闻内容一对一,结论:
模型如下
data class News(
val id: Int?,
val title: String,
val content: String,
val publishDate: Date,
val commentCount: Int,
val introduction: Introduction?,
val commentList:ArrayList<Comment> = ArrayList<Comment>(),
val categoryList:ArrayList<Category> = ArrayList<Category>()
)
data class Introduction(val id: Int, val guide: String, val digest: String)
data class Category(val id: Int, val name: String, val newsList:ArrayList<News> = ArrayList<News>())
data class Comment(val cm: String,val news: News?)
更新配置文件:
<litepal>
<dbname value="demo"></dbname>
<version value="3"></version>
<list>
<mapping class="com.example.ha.News"></mapping>
<mapping class="com.example.ha.Comment"></mapping>
<mapping class="com.example.ha.Introduction"></mapping>
<mapping class="com.example.ha.Category"></mapping>
</list>
</litepal>
生成表如下
category表:
其中category_news为自动生成的中间表:
comment表:
introduction表:
news表:
三、
操作数据前需要做的一件事就是:
将所有的实体类继承LitePalSupport这个类,继承了LitePalSupport类之后,这些实体类就拥有了进行CRUD操作的能力,调用里面的api执行相应的数据库处理
data class News(
val id: Int?,
val title: String,
val content: String,
val publishDate: Date,
val commentCount: Int,
val introduction: Introduction?,
val commentList:ArrayList<Comment> = ArrayList<Comment>(),
val categoryList:ArrayList<Category> = ArrayList<Category>()
):LitePalSupport()
data class Introduction(val id: Int, val guide: String, val digest: String):LitePalSupport()
data class Category(val id: Int, val name: String, val newsList:ArrayList<News> = ArrayList<News>()):LitePalSupport()
data class Comment(val cm: String,val news: News?):LitePalSupport()
插入数据:
val news = News(1,"清仓大甩卖","全场2折", Date(), 20, null)
if (news.save()) println("成功") else println("失败")
//使用saveThrows()可抛出异常信息
多表插入:
val comment1 = Comment("好评", null)
comment1.save()
val news = News(null,"全面小康","牛逼", Date(), 20, null)
news.commentList.add(comment1)
if (news.save()) println("成功,${news.id}}") else println("失败")
comment表: