美文网首页
Android数据库框架LitePal的使用

Android数据库框架LitePal的使用

作者: 五谷观精分道长 | 来源:发表于2017-04-12 21:25 被阅读313次

    前言

    LitePal是一款开源的Android数据库框https://github.com/LitePalFramework/LitePa,它采用了对象关系映射(ORM)的模型,把对数据库的操作转换为对对象的操作。
    开发者为郭霖。

    参考文章http://www.jianshu.com/p/557682e0a9f0
    郭霖CSDN

    使用准备

    导入

    compile 'org.litepal.android:core:1.5.1'
    

    导入配置文件

    新建assets文件夹,放入新建的litepal.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
        <!--
            Define the database name of your application.
            By default each database name should be end with .db.
            If you didn't name your database end with .db,
            LitePal would plus the suffix automatically for you.
            For example:
            <dbname value="demo" />
        -->
        <dbname value="demo" />
    
        <!--
            Define the version of your database. Each time you want
            to upgrade your database, the version tag would helps.
            Modify the models you defined in the mapping tag, and just
            make the version value plus one, the upgrade of database
            will be processed automatically without concern.
                For example:
            <version value="1" />
        -->
        <version value="1" />
    
        <!--
            Define your models in the list with mapping tag, LitePal will
            create tables for each mapping class. The supported fields
            defined in models will be mapped into columns.
            For example:
            <list>
                <mapping class="com.test.model.Reader" />
                <mapping class="com.test.model.Magazine" />
            </list>
        -->
        <list>
        </list>
    
        <!--
            Define where the .db file should be. "internal" means the .db file
            will be stored in the database folder of internal storage which no
            one can access. "external" means the .db file will be stored in the
            path to the directory on the primary external storage device where
            the application can place persistent files it owns which everyone
            can access. "internal" will act as default.
            For example:
            <storage value="external" />
        -->
    
    </litepal>
    

    <dbname>用于设定数据库的名字,<version>用于设定数据库的版本号,<list>用于设定所有的映射模型,我们稍后就会用到。

    配置LitePalApplication

    简单的配置就是

    <manifest>  
        <application  
            android:name="org.litepal.LitePalApplication"  
            ...  
        >  
        ...  
        </application>  
    </manifest>  
    

    开始使用

    如何使用面向对象的思想实现简单的操作 建表、增删改查

    建表

    类Datas 对应的就是表,数据类型自动映射到数据库数据类型
    int、short、long、float、double、boolean、String和Date

    public class Datas{  
        //可以不写自动生成  
        private int id;  
    
        private String title;  
          
        private String content;  
          
        private Date publishDate;  
          
        private int commentCount;  
          
        // 自动生成get、set方法  
        ...  
    }  
    

    导入到litepal.xml中完成建表过程。

    <list>
            <mapping class="com.example.administrator.zhanma.db.dbmodel.Datas"></mapping>
    </list>
    

    注意
    只有private修饰的字段才会被映射到数据库表中,即如果有某一个字段不想映射的话,就设置为public、protected或者default修饰符就可以了。

    创建表SQLiteDatabase db = Connector.getDatabase();

    升级数据库

    同样的新建一个Conment的实体类,然后引入到litepal.xml中。关键一点就是要更改版本号,把数据库的版本号增加一。

    同样的无论任何对数据库的结构更改都需要进行版本号的更改。

    比如增加行,就是数据库对应实体类的参数增加并且版本号增加。
    另外支持删除一列(android本身不支持,但是框架做到了类似的功能)。

    基本操作

    进行CRUD操作的基础就是表模型类继承DataSupport类

    public class Datas extends DataSupport{
    
    
        private String title;
    
        private String content;
    
        private Date publishDate;
    
        private int commentCount;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public Date getPublishDate() {
            return publishDate;
        }
    
        public void setPublishDate(Date publishDate) {
            this.publishDate = publishDate;
        }
    
        public int getCommentCount() {
            return commentCount;
        }
    
        public void setCommentCount(int commentCount) {
            this.commentCount = commentCount;
        }
    }
    

    插入

    Datas mDatas = new Datas();
                    mDatas.setTitle("测试数据");
    
                    if (mDatas.save()) {
                        Snackbar.make(mCoordinatorLayout, "存储成功!", Snackbar.LENGTH_SHORT).show();
                    } else {
                        Snackbar.make(mCoordinatorLayout, "存储失败!", Snackbar.LENGTH_SHORT).show();
                    }
    

    修改

    如果想把DEST表中id为4的destId改为"1",可以这样写:

    ContentValues values = new ContentValues();  
    values.put("destId", "1");  
    DataSupport.update(DEST.class, values, 4);  
    
    //或者用下面这种方法
    
    DEST updateNews = new DEST();  
    updateNews.setDestId("1");  
    updateNews.update(4);
    

    如果想把DEST表中所有destId为"1"的改为"2"可以这样写:

    ContentValues values = new ContentValues();  
    values.put("destId", "2");  
    DataSupport.updateAll(DEST.class, values, "destId = ?", "1");  
    
    //或者用下面这种方法
    
    DEST updateNews = new DEST();  
    updateNews.setdestId("2");  
    updateNews.updateAll("destId = ?", "1");
    

    删除

    比如说我们想删除DEST表中id为2的记录,就可以这样写:

    DataSupport.delete(News.class, 2);
    

    想把DEST表中destId为“1”的所有数据删除,就可以这样写:

    DataSupport.deleteAll(DEST.class, "destId = ? ", "1");
    

    如果我们想把DEST表中所有的数据全部删除掉,就可以这样写:

    DataSupport.deleteAll(DEST.class);
    

    查询

    查询DEST表中id为1的这条记录,使用LitePal就可以这样写:

    DEST mDest = DataSupport.find(DEST.class, 1);
    

    想要获取DEST表中的第一条数据,只需要这样写:

    DEST firstDest = DataSupport.findFirst(DEST.class);
    

    想要获取News表中的最后一条数据,只需要这样写:

    DEST lastDest = DataSupport.findLast(DEST.class);
    

    想把DEST表中id为1、3、5、7的数据都查出来,只需要这样写:

    List<DEST> mDestList = DataSupport.findAll(DEST.class, 1, 3, 5, 7);
    

    查询所有数据,只需要这样写:

    List<DEST> mDestList = DataSupport.findAll(DEST.class);
    

    想查询DEST表中所有父类id为"1"的数据,就可以这样写:

    List<DEST> mDestList = DataSupport.where("parentId = ?", "1").find(DEST.class);
    

    许你并不需要那么多的数据,而是只要cnName和enName这两列数据。那么也很简单,我们只要再增加一个连缀就行了,如下所示:

    List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").find(DEST.class);
    

    也许你还要数据按照添加的时间倒序排列,那么可以这样:

    List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").find(DEST.class);
    

    数据太多了,其实你只要前10行就行了,那么可以这样:

    List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).find(DEST.class);
    

    如果我们想进行分页展示,那么翻页了,怎么办?可以添加一个偏移量就好了,这样:

    List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).offset(10).find(DEST.class);
    

    内置的聚合函数

    count()
    如果想统计行数,那么就可以调用count()即可:

    int result = DataSupport.count(DEST.class);
    

    如果想统计parentId为"1"的数据的行数,那么可以这样:

    int result = DataSupport.where("parentId = ?", "1").count(DEST.class);
    

    sum()
    如果想统计一下DEST表中,所有updateTime的和(虽然毫无用处....),那么可以这样:

    long result = DataSupport.sum(DEST.class, "updateTime", long.class);
    

    注意
    第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。
    sum()方法只能对具有运算能力的列进行求合,比如说整型列或者浮点型列,如果你传入一个字符串类型的列去求合,肯定是得不到任何结果的,这时只会返回一个0作为结果。

    剩下的聚合函数方法大同小异了:
    average()
    max()
    min()

    表关联

    三种对应关系一对一,一对多,多对多。
    口诀就是

    即一对一关联的实现方式是用外键,多对一关联的实现方式也是用外键,多对多关联的实现方式是用中间表。

    记下了这个口诀,在很多数据库设计的时候,你都可以发挥得更加游刃有余。

    而使用LitePal只需要在对象中声明好它们相互之间的引用关系,LitePal就会自动在数据库表之间建立好相应的关联关系了。

    下面看如何声明引用关系:

    一对一:

    首先新建两个类News和Introduction,具体略。
    然后在

    public class News {  
        ...  
        private Introduction introduction;  
          
        // 自动生成get、set方法  
    }  
    

    这一行就能表明private Introduction introduction; 这两个表是一对一关系的。

    一对多:

    Comment和News是一对多的关系。

    public class News {  
        ...  
        private Introduction introduction;  //一对一
          
        private List<Comment> commentList = new ArrayList<Comment>();  //一对多
          
        // 自动生成get、set方法  
    }  
    

    多对多:

    News中可以包含多个Category

    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类也应该使用相同的

    public class Category {  
        ...  
        private List<News> newsList = new ArrayList<News>();  
          
        // 自动生成get、set方法  
    }  
    

    修改后,添加版本号测试。就可以看到

    一对一关系中,自动添加了外键,new_id

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

    category_news是中间表,一列是news_id,一列是category_id,分别对应着两张表的外键,多对多关系也建立了。


    以上是使用说明。

    相关文章

      网友评论

          本文标题:Android数据库框架LitePal的使用

          本文链接:https://www.haomeiwen.com/subject/hhdsattx.html