您的位置:首页 > 移动开发 > Android开发

Android数据库高手秘籍(四)——使用LitePal建立表关联

2016-10-13 21:31 453 查看


使用LitePal建立表关联

虽说口诀就是这个样子,但牵扯到表关联的时候毕竟增加了建表的难度,建表语句会更加复杂,你也需要格外地小心以防止出现什么错误。因此,使用LitePal来自动建立表关联又是一个非常不错的选择,我们不需要关心什么外键、中间表等实现的细节,只需要在对象中声明好它们相互之间的引用关系,LitePal就会自动在数据库表之间建立好相应的关联关系了,下面我们就来尝试一下吧。

首先确定一下一共涉及到了哪些实体类,News和Comment,这两个类我们在前两篇文章中就已经建好了,然后还需要有Introduction和Category这两个类,新建Introduction类,代码如下所示:

[java] view
plain copy

 





public class Introduction {  

      

    private int id;  

      

    private String guide;  

      

    private String digest;  

      

    // 自动生成get、set方法  

}  

接着新建Category类,代码如下所示:

[java] view
plain copy

 





public class Category {  

      

    private int id;  

      

    private String name;  

      

    // 自动生成get、set方法  

}  

现在四个类都已经建好了,但目前它们都还是各自独立的,互相之间没有任何联系,那么我们现在就开始用极为简单易懂的方式来给它们建立关联吧。首先,News和Introduction是一对一的关系,那就可以在News类中添加如下引用:

[java] view
plain copy

 





public class News {  

    ...  

    private Introduction introduction;  

      

    // 自动生成get、set方法  

}  

就是这么简单,在News类中可以得到一个对应的Introduction的实例,那么它们之间就是一对一关系了。

接着Comment和News是多对一的关系,因此News中应该包含多个Comment,而Comment中应该只有一个News,所以就可以这样写:

[java] view
plain copy

 





public class News {  

    ...  

    private Introduction introduction;  

      

    private List<Comment> commentList = new ArrayList<Comment>();  

      

    // 自动生成get、set方法  

}  

先使用一个泛型为Comment的List集合来表示News中包含多个Comment,然后修改Comment类的代码,如下所示:

[java] view
plain copy

 





public class Comment {  

    ...  

    private News news;  

      

    // 自动生成get、set方法   

}  

在Comment类中声明了一个News的实例,这样就清楚地表示出了News中可以包含多个Comment,而Comment中只能有一个News,也就是多对一的关系了。

最后News和Category是多对多的关系,相信聪明的你一定已经知道该怎么写了。News中可以包含多个Category,所以仍然应该使用List集合来表示:

[java] view
plain copy

 





public class News {  

    ...  

    private Introduction introduction;  

      

    private List<Comment> commentList = new ArrayList<Comment>();  

      

    private List<Category> categoryList = new ArrayList<Category>();  

      

    // 自动生成get、set方法  

}  

而Category中也可以包含多个News,因此Category类也应该使用相同的写法,如下所示:

[java] view
plain copy

 





public class Category {  

    ...  

    private List<News> newsList = new ArrayList<News>();  

      

    // 自动生成get、set方法  

}  

这样就清楚地表达出它们之间是多对多的关联了。
关联关系都声明好了之后,我们只需要将所有的实体类都添加到映射列表当中,并将数据库版本号加1就可以了。修改litepal.xml的代码,如下所示:

[html] view
plain copy

 





<?xml version="1.0" encoding="utf-8"?>  

<litepal>  

    <dbname value="demo" ></dbname>  

  

    <version value="4" ></version>  

  

    <list>  

        <mapping class="com.example.databasetest.model.News"></mapping>  

        <mapping class="com.example.databasetest.model.Comment"></mapping>  

        <mapping class="com.example.databasetest.model.Introduction"></mapping>  

        <mapping class="com.example.databasetest.model.Category"></mapping>  

    </list>  

</litepal>  

基本上到这里就可以轻松地说结束了,现在只需要任意操作一下数据库,表之间的关联关系就将会自动建立,比如说调用一下Connector.getDatabase()方法。

下面我们来验证一下吧,输入.table命令查看一下当前数据库中的表,如下所示:



OK,news、comment、category、introduction这几张表全都有了,除此之外还有一张category_news中间表。那我们要来一一检查一下了,先查看一下introduction表的结构吧,如下所示:



可以看到,多了一个news_id列,说明introduction表和news表之间的一对一关系已经建立好了。

然后再检查一下comment表的结构,如下所示:



OK,comment表中也有一个news_id的列,那么comment表和news表之间的多对一关系也已经建立好了。

最后检查一下category_news这张中间表的结构,如下所示:



一共只有两列,一列是news_id,一列是category_id,分别对应着两张表的外键,这样news表和category表的多对多关系也建立好了。

借助LitePal的帮助,即使你并不熟悉数据库的表关联设计,只要你会面向对象编程,都可以轻松地将表与表之间的关联建立起来。创建表、升级表、表关联,这就是LitePal在数据库表管理方面给我们带来的巨大便利,相信大家都能体会到它的魅力所在了。那么到这里为止,我们就把使用LitePal进行表管理的知识全部学完了,从下一篇文章开始,我将会讲解如何使用LitePal进行CRUD的操作。感兴趣的朋友请继续阅读 Android数据库高手秘籍(五)——LitePal的存储操作 。


LitePal开源项目地址:https://github.com/LitePalFramework/LitePal

第一时间获得博客更新提醒,以及更多技术信息分享,欢迎关注我的微信公众号,扫一扫下方二维码或搜索微信号guolin_blog,即可关注。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: