精华内容
参与话题
问答
  • LitePal

    千次阅读 2018-06-25 16:38:33
    LitePal 注意一 litepal.xml放于assets下一级包 二或其它级包报错 org.litepal.exceptions.InvalidAttributesException: dbname is empty or not defined in litepal.xml file, or your litepal.xml ...

    前言

    郭霖开源项目使用笔记。

    说明

    • LitePal映射规则非常轻量级,不像一些其它数据库框架需每模型类单配一映射关系XML,LitePal所有映射自动完成。据LitePal数据类型支持,可进行对象关系映射的数据类型共8种,int、short、long、float、double、boolean、String和Date。只要声明成这8种数据类型的字段都会被自动映射到数据库表中,不需任何额外配置。
    • 实体类中Object属性不会被映射到数据库表中。

    方法

    创建

    SQLiteDatabase db = Connector.getDatabase();
    或
    Connector.getDatabase();
    


    删除

    LitePal.deleteDatabase("数据库名");
    

    列设默值

    DrillingFluidMaterial drillingFluidMaterial = new DrillingFluidMaterial();
    drillingFluidMaterial.setToDefault("visibleState");
    drillingFluidMaterial.updateAll();
    
    setToDefault()传要改字段名(类中字段名)
    

    排序

    asc正序
    LitePal.order("widtheditdateAssist aes").find(Inputone.class);
    
    desc倒序
    LitePal.order("widtheditdateAssist desc").find(Inputone.class);
    
    一次仅单字段排序(多字段无效)
    用前注意本地数据库已排序否
    

    配置

    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>
        -->
        <dbname value="basicConfiguration " />
        <!--
        	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>
        -->
        <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>
        		<mapping class="com.test.model.Magazine"></mapping>
        	</list>
        -->
        <list>
            <mapping class="bean.sync.Block" />
            <mapping class="bean.sync.Ground" />
            <mapping class="bean.sync.ComplexType" />
            <mapping class="bean.sync.IntegratedMachineSieveCloth" />
            <mapping class="bean.sync.DrillingFluidMaterial" />
        </list>
        <!--
        	Define the cases of the tables and columns name.
        	Java is a case sensitive language, while database is case insensitive.
        	LitePal will turn all classes names and fields names into lowercase by default while creating or upgrading database.
        	Developers can change this behavior into the styles their like.
        	"keep" will keep the cases of classes and fields.
        	"upper" will turn all classes names and fields names into uppercase.
        	"lower" will act as default.
        	Do not change the value after you run your app for the first time, or it might cause the exception that column can not be found.
        	value options: keep lower upper
        	For example:    
        	<cases value="lower" ></cases>
        -->
        <!--
            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="internal"></storage>
        -->
    </litepal>
    
    数据库名不可大写字母开头
    
    <storage value="internal" />数据库建于data->data->包名->databases
    <storage value="guolin/database" />数据库建于SD卡guolin/database目录
    

    litepal.xml放于assets下一级包

    二或其它级包报错

    org.litepal.exceptions.InvalidAttributesException: dbname is empty or not defined in litepal.xml file, or your litepal.xml file is missing.
    

    初始化

    public class MyOwnApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            LitePal.initialize(this);
        }
        ...
    }
    

    public class App extends LitePalApplication {
        
        @Override
        public void onCreate() {       
            super.onCreate();
            ...
        }
    	...
    }
    

    主键

    实体类无字段id时LitePal默置主键id(int或long),实体类有字段id时直被LitePal当作主键(int或long)。服务器返实体类字段id为String类型时因直被LitePal当作主键致主键应有数据类型(int或long)与返实体类字段id数据类型(String)冲突,此时服务器返实体类字段id更名为serviceId即可。

    插入

    多次插入数据,数据库表中数据不重复插入。

    字段

    建表时实体类大写属性自转小写

    注意

    • 数据库头次创后改名即创(即同存多数据库),<version value="1" />设版本不可控。
    • 默0,同法改1成功改回0失败。
      改1
      drillingFluidMaterial.setVisibleState(1);
      drillingFluidMaterial.updateAll("serviceid = ? and hgmc = ?", drillingFluidMaterial.getServiceId(), drillingFluidMaterial.getHgmc());
      
      改回0
      drillingFluidMaterial.setVisibleState(0);
      drillingFluidMaterial.updateAll("serviceid = ? and hgmc = ?", drillingFluidMaterial.getServiceId(), drillingFluidMaterial.getHgmc());
      
    • 修改数据不改主键值,保存数据主键值增1。
    • 一对多 ,一增则多增并自设对应外键;一改且连带多数据变化则多变化部分无外键。
    • 所建表含baseObjId字段
    • 注意命名,否实体类字段用SQL关键字(如username)致创表报错。
      an exception that indicates there was an error with sql parsing or execution
      

    参考

    展开全文
  • litepal

    2019-08-21 17:01:16
    Android数据库框架 - LitePal学习笔记 简述 LitePal是郭神(郭霖)在2014年的杰作,三年后在github上有了一个更新,故来学习一番,没想到还挺好用,这里做下笔记。LitePal是一款开源的Android数据库框架,它采用了...

    Android数据库框架 - LitePal学习笔记

    简述

    LitePal是郭神(郭霖)在2014年的杰作,三年后在github上有了一个更新,故来学习一番,没想到还挺好用,这里做下笔记。LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发时最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表、増删改查的操作。并且LitePal很“轻”,jar包只有100k不到,而且近乎零配置,这一点和hibernate这类的框架有很大区别。

    github:https://github.com/LitePalFramework/LitePal

    一、LitePal的基本用法

    1. 引入Jar包或依赖

    1)使用gradle依赖

    dependencies {
        compile 'org.litepal.android:core:1.5.0'
    }
    

    2)导入jar包

    ①jar包:https://github.com/LitePalFramework/LitePal/raw/master/downloads/litepal-1.5.0.jar

    ②源码包:https://github.com/LitePalFramework/LitePal/raw/master/downloads/litepal-1.5.0-src.jar

    通过上述地址将jar包下载下来后复制到libs目录下即可。

    2. 配置litepal.xml

    在assets目录下创建一个litepal.xml文件,复制以下代码进去:

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="数据库名" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"数据库版本号,用于更新数据库"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>
        <span class="hljs-comment">&lt;!--这里是类映射--&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    3. 配置LitePalApplication

    1)如果你的项目中没有自定义APP,则直接在清单文件中进行如下配置:

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

    2)如果你项目中有继承Application的自定义APP:

    ①把 extends Application 换成 extends LitePalApplication.

    ②在清单文件中使用你自定义的APP,如自定义的APP为MyApplication:

    <manifest>  
        <application  
            android:name="com.example.MyApplication"  
            ...  
        >  
        ...  
        </application>  
    </manifest> 
    

    3)如果你项目中的自定义APP是继承了一个jar包中的第三方Application(即:源码修改不了):

    方案一:

    1. 你可以把LitePal的源码下载下来,然后把src目录下的所有代码直接拷贝到你项目的src目录下面
    2. 接着打开LitePalApplication类,将它的继承结构改成继承自第三方Application
    3. 再让MyApplication继承自LitePalApplication,这样所有的Application就都可以在一起正常工作了。

    方案二:

    public class MyOwnApplication extends AnotherApplication {
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">super</span>.onCreate();
        LitePal.initialize(<span class="hljs-keyword">this</span>);
    }
    ...
    

    }

    二、使用LitePal建表

    例子:假设开发的是一款新闻类APP,本地需要一张新闻表记录新闻,因为该框架是ORM框架,即需要一个新闻类News来表示新闻表,通过新闻类创建新闻表,只需要2步:

    1、创建一个实体类

    public class News {  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;  
      
    <span class="hljs-keyword">private</span> String title;  
      
    <span class="hljs-keyword">private</span> String content;  
      
    <span class="hljs-keyword">private</span> Date publishDate;  
      
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> commentCount;  
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    ...  
    

    }

    2、修改assets目录下的litepal.xml文件

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"1"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    三、使用LitePal升级表

    升级表的场景有两种:

    • ① 增加表

    • ② 修改表结构

    1、增加一张表

    例子:对上述的新闻类APP增加记录评论的功能,那么就需要多一张评论表,即多一个评论类Comment(这里不考虑表之间的关系,本次升级只是多增加一张表)。

    1)、根据升级需求创建实体类

    public class Comment {  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;  
      
    <span class="hljs-keyword">private</span> String content;  
      
    <span class="hljs-comment">// 自动生成get、set方法   </span>
    ...  
    

    }

    2)、修改assets目录下的litepal.xml文件

    升级需要将version节点的value值+1。

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"2"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    2、修改之前的表结构

    例子:假设上述的评论类Comment是上个版本中少了一个表示发布时间的属性publishDate,则在这次要发布的版本中需要加入。

    1)、根据升级需求修改实体类

    public class Comment {  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;  
      
    <span class="hljs-keyword">private</span> String content;  
      
    <span class="hljs-keyword">private</span> Date publishDate;  <span class="hljs-comment">//多了一个表示发布时间的属性</span>
      
    <span class="hljs-comment">// 自动生成get、set方法   </span>
    ...  
    

    }

    2)、修改assets目录下的litepal.xml文件

    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"3"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    ...  
    

    </litepal>

    四、使用LitePal建立表关联

    1、一对一:

    例子:每篇新闻(类News)都对应着一个简介(类Introduction),一个简介对应着一篇新闻。

    1)、在一个类中持有另一方的引用

    ①简介类

    public class Introduction {  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;  
      
    <span class="hljs-keyword">private</span> String guide;  
      
    <span class="hljs-keyword">private</span> String digest;  
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    ②新闻类(持有简介类)

    public class News {  
        ...  
        private Introduction introduction;  //一篇新闻对应着一个简介
    
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    2)、修改litepal.xml中的版本号,加入新表对就实体类的引用,更新数据库。

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"4"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    2、多对一:

    例子:一篇新闻(类News)有多条评论(类Comment)

    1)、在少的一方持有多的一方的集合,在多的一方持有少的一方的引用

    ①新闻类(少的一方)

    public class News {  
        ...  
        private Introduction introduction;  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span>&lt;Comment&gt; commentList = <span class="hljs-keyword">new</span> ArrayList&lt;Comment&gt;(); <span class="hljs-comment">//一篇新闻对应多条评论 </span>
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    ②简介类(多的一方)

    public class Comment {  
        ...  
        private News news;  //一条评论对应一篇新闻
    
    <span class="hljs-comment">// 自动生成get、set方法   </span>
    

    }

    2)、修改litepal.xml中的版本号,更新数据库。

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"5"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> 
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    3、多对多:

    例子:一篇新闻(类News)对应的多个类别(类Category),如iphone2000发布,可以是手机类、科技类,还可以是头条。

    1)、彼此持有对方的集合

    ①新闻类

    public class News {  
        ...  
        private Introduction introduction;  
    
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span>&lt;Comment&gt; commentList = <span class="hljs-keyword">new</span> ArrayList&lt;Comment&gt;();  
      
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span>&lt;Category&gt; categoryList = <span class="hljs-keyword">new</span> ArrayList&lt;Category&gt;();  <span class="hljs-comment">//一篇新闻对应多种类别</span>
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    ②类别类

    public class Category {  
        ...  
        private List<News> newsList = new ArrayList<News>();  //一种类别对应多篇新闻
    
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    2)、修改litepal.xml中的版本号,更新数据库。

    <?xml version="1.0" encoding="utf-8"?>  
    <litepal>  
        <dbname value="demo" ></dbname>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"6"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>  
    
    <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
        <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Category"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span>  
    <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</span>  
    

    </litepal>

    五、使用LitePal的存储操作(增)

    因为LitePal可以通过一个普通的实体类把对应的表创建出来或者对表升级,所以没有要求继承指定的类或实现指定的接口。但是,如果要对表进行存储操作,则就有一个要求了,那就是这些实体类必须继承DataSupport。

    1、让实体类继承DataSupport

    public class News extends DataSupport{  
    
    ......  
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    

    }

    2、使用save()对单个实体数据进行保存

    例子:对一篇新闻进行保存

    News news = new News();  
    news.setTitle("这是一条新闻标题");  
    news.setContent("这是一条新闻内容");  
    news.setPublishDate(new Date());  
    news.save();  
    
    • tip:save()是不会抛出异常的,且返回的是boolean。

    常规判断数据是否保存成功的方式如下:

    if (news.save()) {  
        Toast.makeText(context, "存储成功", Toast.LENGTH_SHORT).show();  
    } else {  
        Toast.makeText(context, "存储失败", Toast.LENGTH_SHORT).show();  
    } 
    

    3、使用saveThrows()对单个实体数据进行保存

    例子:对一篇新闻进行保存

    News news = new News();  
    news.setTitle("这是一条新闻标题");  
    news.setContent("这是一条新闻内容");  
    news.setPublishDate(new Date());  
    news.saveThrows();  
    
    • tip:saveThrows()是当保存失败时会抛出异常的,所以,可以通过对这个异常进行捕获来处理存储失败的情况。

    3、使用DataSupport.saveAll()对多个实体数据进行保存

    List<News> newsList;  
    ...  
    DataSupport.saveAll(newsList);  
    

    4、多对一的关系的数据保存

    Comment comment1 = new Comment();  
    comment1.setContent("好评!");  
    comment1.setPublishDate(new Date());  
    comment1.save();                                    //保存了第一条评论
    Comment comment2 = new Comment();  
    comment2.setContent("赞一个");  
    comment2.setPublishDate(new Date());  
    comment2.save();                                    //保存了第二条评论  
    News news = new News();  
    news.getCommentList().add(comment1);  
    news.getCommentList().add(comment2);                //把前两条保存过的评论添加到News对象的评论集合中
    news.setTitle("第二条新闻标题");  
    news.setContent("第二条新闻内容");  
    news.setPublishDate(new Date());  
    news.setCommentCount(news.getCommentList().size());  
    news.save();                                        //保存News对象
    

    5、使用saveAsync()对单个数据进行异步保存

    News news = new News();  
    news.setTitle("这是一条新闻标题");  
    news.setContent("这是一条新闻内容");  
    news.setPublishDate(new Date()); 
    news.saveAsync().listen(new SaveCallback() {
        @Override
        public void onFinish(boolean success) {
    
    }
    

    });

    6、当数据保存成功时,对象中的id会被赋值

    当调用save()方法或saveThrows()方法存储成功之后,LitePal会自动将该条数据对应的id赋值到实体类的id字段上。
    以下做个实验:

    News news = new News();  
    news.setTitle("这是一条新闻标题");  
    news.setContent("这是一条新闻内容");  
    news.setPublishDate(new Date());  
    Log.d("TAG", "news id is " + news.getId());  
    news.save();  
    Log.d("TAG", "news id is " + news.getId());  
    

    打印结果如下:

    news id is 0
    news id is 1
    

    六、使用LitePal的修改和删除操作(删改)

    使用LitePal的修改和删除操作分别有两种方式:

    • ①使用DataSupport类中的静态方法(即实体类不需要继承DataSupport)。
    • ②使用继承了DataSupport的实体类中的方法。

    *tip:方式①中必须使用ContentValues类,而方式②不用。

    1、修改操作

    1)修改指定id的数据

    ①使用DataSupport类中的update()静态方法:

    DataSupport.update(实体类.class,ContentValues,id值)

    ContentValues values = new ContentValues();  
    values.put("title", "今日iPhone6发布");  
    DataSupport.update(News.class, values, 2);  
    
    ②使用继承了DataSupport的实体类中的方法:

    obj.update(id值)

    News updateNews = new News(); //News必须继承DataSupport
    updateNews.setTitle("今日iPhone6发布");  
    updateNews.update(2);  
    

    2)修改指定条件的数据

    ①使用DataSupport类中的updateAll()静态方法:

    DataSupport.updateAll(实体类.class,ContentValues,条件组)

    ContentValues values = new ContentValues();  
    values.put("title", "今日iPhone6 Plus发布");  
    DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "今日iPhone6发布", "0");  
    
    ②使用继承了DataSupport的实体类中的方法:

    obj.updateAll(条件组)

    News updateNews = new News();  //News必须继承DataSupport
    updateNews.setTitle("今日iPhone6发布");  
    updateNews.updateAll("title = ? and commentcount > ?", "今日iPhone6发布", "0"); 
    

    3)修改全表数据

    DataSupport.updateAll(实体类.class,ContentValues)

    例子:把news表中所有新闻的标题都改成“今日iPhone6发布”。

    ContentValues values = new ContentValues();  
    values.put("title", "今日iPhone6 Plus发布");  
    DataSupport.updateAll(News.class, values);  
    

    4)将对应字段修改为默认值

    obj.setToDefault("字段名")

    该方法是针对继承了DataSupport的实体类来说的!!!

    News updateNews = new News();  //News必须继承DataSupport
    updateNews.setToDefault("commentCount");  
    updateNews.updateAll();  
    

    2、删除操作

    *删除操作的有几个地方需要注意:

    • 只能删除持久化过的数据,所谓持久化过的数据,通俗的说就是保存过的数据,也就是保存或查询出来的数据才能被删除。
    • 如果删除的数据id是另一张表中的外键,则在删除该数据时,别一张表中的关联数据也会被删除。
    • 继承了DataSupport的实体类没有deleteAll方法,所以只有一种删除指定条件的数据方式(即:DataSupport.deleteAll())。
    • 最后切记,多条件时只能用单词and连接条件,不能用符号&!!!

    1)删除指定id的数据

    ①使用DataSupport类中的delete()静态方法:

    DataSupport.delete(实体类.class,id值)

    DataSupport.delete(News.class, 2);  
    
    ②使用继承了DataSupport的实体类中的方法:

    obj.delete(id值)

    这里new出了一个News对象,这个对象明显是没有持久化的,此时调用delete()方法则不会删除任何数据。

    News news = new News();  
    news.delete();  
    

    如果我们之前将这个对象持久化过了,那么调用delete()方法就会把这个对象对应的数据删除掉了。

    News news = new News();  
    news.setTitle("这是一条新闻标题");  
    news.setContent("这是一条新闻内容");  
    news.save();  
    ...  
    news.delete();  
    

    可以使用DataSupport中的isSaved()方法,判断对象是否持久化。

    News news;  
    ...  
    if (news.isSaved()) {  
        news.delete();  
    }  
    

    2)删除指定条件的数据

    DataSupport.deleteAll(实体类.class,条件组)

    DataSupport.deleteAll(News.class, "title = ? and commentcount = ?", "今日iPhone6发布", "0");
    

    3)删除全表数据

    DataSupport.deleteAll(实体类.class)

    DataSupport.deleteAll(News.class);  
    

    七、使用LitePal的查询(查)

    1、简单查询

    1)查询单条数据

    ①查询指定id数据

    News news = DataSupport.find(News.class, 1);
    

    ②查询第一条数据

    News firstNews = DataSupport.findFirst(News.class);
    

    ③查询最后一条数据

    News lastNews = DataSupport.findLast(News.class);
    

    2)查询多条数据

    ①查询指定多个id数据

    //方式一:
    List<News> newsList = DataSupport.findAll(News.class, 1, 3, 5, 7);
    

    //方式二:
    long[] ids = new long[] { 1, 3, 5, 7 };
    List<News> newsList = DataSupport.findAll(News.class, ids);

    ②查询表中所有数据

    List<News> allNews = DataSupport.findAll(News.class);    
    

    2、连缀查询

    例子:查询 新闻表评论数大于0第11到20条 数据,以 发布时间倒序 排序方式呈现,只取 “标题”和“内容” 两列内容。

    一般的sql语句如下:

    select title,content from news where commentcount > 0 order by publishdate desc limit 10,10;
    

    使用LitePal的连缀查询,代码如下:

    List<News> newsList = DataSupport.select("title", "content")
                                     .where("commentcount > ?", "0")
                                     .order("publishdate desc")
                                     .offset(10)
                                     .limit(10)
                                     .find(News.class);
    

    *tip:其中select、where、order、offset、limit可以任意放置位置,可以根据自己的需求任意删减,但find不能去掉。

    3、激进查询

    LitePal的默认查询是懒查询,即:只能查询单表中的数据,关联表中的数据无法查到。

    1)如何使用激进查询

    如果需要将关联表中的数据一起查出(激进查询),可以将find()方法的最后一个参数(boolean isEager)设置为true即可,如:

    News news = DataSupport.find(News.class, 1, true);  
    List<Comment> commentList = news.getCommentList();  
    

    2)激进查询的缺点:

    • 一旦关联表中的数据很多,查询速度可能就会非常慢。
    • 激进查询只能查询出指定表的关联表数据,但是没法继续迭代查询关联表的关联表数据。

    3)使用懒查询代替激进查询

    激进查询不被LitePal推荐,推荐使用懒查询,如果要使用懒查询,可以对实体类做如下修改,以做到关联表查询:

    public class News extends DataSupport{      
        ...  
        public List<Comment> getComments() {  
            return DataSupport.where("news_id = ?", String.valueOf(id)).find(Comment.class);  
        }  
    }
    

    *tip:只有该getComments()方法被调用的时候,才会去查询关联数据。这种写法会比激进查询更加高效也更加合理。

    4、原生查询

    DataSupport.findBySQL(条件组);

    Cursor cursor = DataSupport.findBySQL("select * from news where commentcount>?", "0");  
    

    八、使用LitePal的聚合函数

    LitePal中一共提供了count()、sum()、average()、max()和min()这五种聚合函数

    1、count()

    count()方法主要是用于统计行数的

    DataSupport.count(实体类.class)

    例子:统计news表中一共有多少行

    int result = DataSupport.count(News.class); 
    //使用连缀查询,增加查询条件
    int result = DataSupport.where("commentcount = ?", "0").count(News.class);  
    

    2、sum()

    sum()方法主要是用于对结果进行求合的

    DataSupport.sum(实体类.class, "要求合的字段", 结果类型)

    例子:统计news表中评论的总数量

    int result = DataSupport.sum(News.class, "commentcount", int.class); // 也可以是float、double  
    

    *tip:如果要求合的字段是非法的,如String,则返回结果是0。

    3、average()

    average()方法主要是用于统计平均数的

    DataSupport.average(实体类.class, "要求平均数的字段")

    例子:统计news表中平均每条新闻有多少评论

    double result = DataSupport.average(News.class, "commentcount");  //默认返回值就是double,因为求平均数大多时候都会有小数,
                                                                    //使用double可以最大程序保留小数位的精度。
    

    *tip:如果要求平均数的字段是非法的,如String,则返回结果是0。

    4、max()

    max()方法主要用于求出某个列中最大的数值

    DataSupport.max(实体类.class, "要求最大值的字段", 结果类型)

    例子:news表中所有新闻里面最高的评论数是多少

    int result = DataSupport.max(News.class, "commentcount", int.class);
    

    5、min()

    min()方法主要用于求出某个列中最小的数值

    DataSupport.min(实体类.class, "要求最小值的字段", 结果类型)

    例子:news表中所有新闻里面最少的评论数是多少

    int result = DataSupport.min(News.class, "commentcount", int.class);  
    

    九、使用注解对字段进行约束

    使用注解@Column可以对字段进行约束,共有4种如下约束:

    @Column(unique = true)              //是否唯一
    @Column(defaultValue = "unknown")   //指定字段默认值
    @Column(nullable = false)           //是否可以为空
    @Column(ignore = true)              //是否可以忽略
    

    例子:一张新闻表,主键唯一,标题不能为空,内容有默认值。

    public class News extends DataSupport {  
    
    <span class="hljs-meta">@Column</span>(unique = <span class="hljs-keyword">true</span>)
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;  
    
    <span class="hljs-meta">@Column</span>(nullable = <span class="hljs-keyword">false</span>)
    <span class="hljs-keyword">private</span> String title;  
      
    <span class="hljs-meta">@Column</span>(defaultValue = <span class="hljs-string">"我是内容"</span>)
    <span class="hljs-keyword">private</span> String content;  
      
    <span class="hljs-keyword">private</span> Date publishDate;  
      
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> commentCount;  
      
    <span class="hljs-comment">// 自动生成get、set方法  </span>
    ...  
    

    }

    十、对多个数据库的支持

    如果项目中用到了多个数据库,LitePal也可以支持,在程序运行的时候可以创建多个数据库。:

    1、创建一个全新的数据库

    LitePalDB litePalDB = new LitePalDB("db2", 1);  //创建一个名为"db2"的第二个数据库
    litePalDB.addClassName(Singer.class.getName()); //将实体类Singer等与db2进行关联
    litePalDB.addClassName(Album.class.getName());
    litePalDB.addClassName(Song.class.getName());
    LitePal.use(litePalDB);                         //使用db2数据库
    

    2、创建一个结构跟旧数据库一样的数据库

    结构跟旧数据库一样的意思是:litepal.xml配置一样。

    LitePalDB litePalDB = LitePalDB.fromDefault("新数据库名");
    LitePal.use(litePalDB);
    

    3、换回默认数据库(原来旧的数据库)

    LitePal.useDefault();
    

    4、删除任意数据库

    LitePal.deleteDatabase("数据库名");
          </div>
        </div>
    
    展开全文
  • Litepal

    2017-04-22 14:28:51
    1.引进litepal,在app/builder.gradle里远程引入依赖org.litepal.android:core:版本号 2.在main文件下创建文件夹assets,在里面创建litepal.xml,编辑里面的内容 3.编辑AndroidManifest.xml文件,将...

    1.引进litepal,在app/builder.gradle里远程引入依赖org.litepal.android:core:版本号

    2.在main文件下创建文件夹assets,在里面创建litepal.xml,编辑里面的内容


    3.编辑AndroidManifest.xml文件,将Application的name指定为org.litepal.LitePalApplication

    4.使用类来创建表模式

    5.把类添加到<list>标签里,添加一个映射 <mapping class= "包名.类" />

    6.调用litepal里的Connector.getDatabase()来创建数据库实例

    7.对于增加,更新操作,创建表的实例,每个实例代表表的一条数据,用表实例的.save()来提交;对于删除,查询,调用DataSupport里的方法实现


    如何查询数据库:

    使用SDK里的platform-tools里的adb.exe工具,把该platform-tools的目录配置到环境变量里,在Windows命令行终端输入adb shell(前提是打开虚拟机或真机),然后跳转到/data/data/包名+程序名/databases的目录下,可以用ls查看有哪些数据库,可以用sqlite3打开数据库,然后可以用.table查看里面有哪些表,可以用.schema查看建表语句,用select语句查看表的具体内容, 然后可以用.exit关闭数据库。


    展开全文
  • LitePal for Android 中文文档 LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most of the database operations without writing ...
  • litepal框架

    2016-04-06 13:21:01
    litepal框架
  • 安卓之LitePal

    2021-01-03 13:38:19
    今天我学习了安卓的数据库,观看了郭霖老师篡写的《第一行代码》中讲述了LitePal,接下来我将讲述《第一行代码》中LitePal的有关对与LitePal的知识。 Litepal是一款android数据库框架,采用了对象关系映射(ORM)的...
  • LitePal 3.0.0

    2020-03-25 10:58:28
    LitePal 3.0.0 LitePal 3.0.0源码 1. 依赖库 1.1 java dependencies { implementation 'org.litepal.android:java:3.0.0' } 这里要注意2.0.0及以前的版本是这样写的: implementation 'org.litepal.android:...

    LitePal 3.0.0

    LitePal 3.0.0源码

    1. 依赖库

    1.1 java

    dependencies {
    	    implementation 'org.litepal.android:java:3.0.0'
    	}
    
    这里要注意2.0.0及以前的版本是这样写的:
    
    implementation 'org.litepal.android:core:2.0.0'
    
    版本号前面core,而3.0的是java 。
    

    1.2 kotlin

    dependencies {
    	    implementation 'org.litepal.android:kotlin:3.0.0'
    	}
    

    2.待续

    展开全文
  • LitePal 开源项目使用

    2017-08-18 17:57:33
    LitePal
  • LitePal简单用法

    千次阅读 热门讨论 2019-04-10 11:28:21
    简单介绍一下LitePalLitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表、増删改查的...
  • LitePal相关应用

    2017-01-20 17:47:08
    LitePal相关应用
  • LitePal操作手机数据库

    2020-11-23 13:44:23
    Android studio手机应用开发过程中,使用LitePal操作数据库的演示项目。适合配合LitePal操作数据库测试代码以及Android应用开发--LitePal操作数据库文章使用。
  • litepal初学

    2019-01-05 13:34:58
    由于小项目的需求设计,需要在本地保存数据库,故而学习一下郭大侠的litepallitepal配置过程: 引入郭大侠的litepal库: implementation ‘org.litepal.android:core:1.3.2’(版本号自己控制) 设计自己的类 在...
  • LitePal的使用

    2019-04-10 17:13:52
    Android LitePal的使用,插入数据,更新数据,删除数据,查询结果等
  • Android LitePal

    2020-12-29 20:37:50
    Android LitePal 介绍 这个库是在GitHub上面的一个非常非常优秀的开源项目,非常非常简便了我们对数据库的操作 使用前准备 导入依赖 打开项目的app目录你就能看见一个build.gradle文件,这个文件非常重要,添加依赖...
  • 安卓litepal

    2018-04-02 16:23:48
    什么是litepal litepal是一种第三方的插件,用于方便开发者使用内置数据库的一种工具。 二.为什么要有litepal 因为litepal是一种数据库工具,利用它可以很轻松的解决数据库问题,减少代码量,节约时间。三.如何...

空空如也

1 2 3 4 5 ... 20
收藏数 2,626
精华内容 1,050
关键字:

litepal