LitePal学习(一)——配置

前言

之前讲到了Lite_orm数据框架的使用,但是由于Lite_orm的不再维护及升级问题,今天介绍另一个数据库-LitePal 的使用
参考文档:
Android数据库高手秘籍
官网

特别提醒LitePal数据库的默认存储路径

默认存储路径与sqlite的默认存储路径相同,为:

 /data/data/your.app.package/databases/your-db-name
一.在gradle中添加库的引用

在项目的app对应的build.gradle,即model:app中添加库的引用,代码如下:

    //LitePal
    compile 'org.litepal.android:core:1.6.0'

引入库给个截图吧,免得引入错误

LitePal学习(一)——配置_第1张图片
3.png
二.在asstes文件夹下建litepal.xml文件

litepal.xml文件代码如下:



    
    
    
    
    
     

litepal.xml文件中 dbname标签表示数据库文件名,version标签为数据库版本号,list标签为表名,以后会做具体介绍

三.配置LitePalApplication

写自己的application继承LitePalApplication,然后做数据库的初始化,这里以我写的AppContext为例:

package com.android.app;

import org.litepal.LitePal;
import org.litepal.LitePalApplication;

/**
 * Title:
 * Description:
 * 

* Created by pei * Date: 2017/11/23 */ public class AppContext extends LitePalApplication{ private static AppContext INSTANCE; public static synchronized AppContext getInstance() { return INSTANCE; } @Override public void onCreate() { super.onCreate(); INSTANCE = this; //引入LitePal数据存储框架 LitePal.initialize(this); } }

然后在mainfast中注册自己的Application
android:name="com.android.app.AppContext"

    
        
            
                

                
            
        
    
四.创建数据表

litePal也是orm思想,用model创建数据表的,但是它的model需要继承类DataSupport,下面就一步步讲解数据表model的建立。
我一般写model的时候,都是希望model是可序列化的,然后还需要具备一个方便打印的方法,于是第一步需要一个BaseModel,代码如下:

package com.android.model;


import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Title:
 * Description:
 * 

* Created by pei * Date: 2017/10/30 */ public class BaseModel implements Serializable{ /**打印对象属性值**/ @Override public String toString() { List> FiledInfos=getFiledsInfo(this); StringBuffer buffer=new StringBuffer(); if(!FiledInfos.isEmpty()){ for(Map map:FiledInfos){ String tag=map.get("name").toString(); if(!"$change".equals(tag)&&!"serialVersionUID".equals(tag)){ String str=map.get("name")+"="+map.get("value")+" "; buffer.append(str); } } } return buffer.toString(); } /**打印对象属性值**/ public String objectToString(Object obj){ List>FiledInfos=getFiledsInfo(obj); StringBuffer buffer=new StringBuffer(); if(!FiledInfos.isEmpty()){ for(Mapmap:FiledInfos){ String tag=map.get("name").toString(); if(!"$change".equals(tag)&&!"serialVersionUID".equals(tag)){ String str=map.get("name")+"="+map.get("value")+" "; buffer.append(str); } } }else{ if(obj!=null){ String className=obj.getClass().getSimpleName(); buffer.append(className); }else{ buffer.append("objectToString方法调用参数为null"); } } return buffer.toString(); } /** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list */ private List getFiledsInfo(Object obj){ List> list=new ArrayList(); if(obj!=null) { Field fields[] = obj.getClass().getDeclaredFields(); String fieldNames[] = new String[fields.length]; Map mapInfo = null; for (int i = 0; i < fields.length; i++) { Object o = getFieldValueByName(fields[i].getName(), obj); mapInfo = new HashMap(); mapInfo.put("type", fields[i].getType().toString()); mapInfo.put("name", fields[i].getName()); mapInfo.put("value", getFieldValueByName(fields[i].getName(), obj)); list.add(mapInfo); } } return list; } /** * 根据属性名获取属性值 */ private Object getFieldValueByName(String fieldName, Object obj){ Object value=null; try { String firstLetter=fieldName.substring(0,1).toUpperCase(); String getter="get" +firstLetter+fieldName.substring(1); Method method=obj.getClass().getMethod(getter,new Class[] {}); value = method.invoke(obj, new Object[] {}); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return value; } /** * 获取属性名数组 */ private String[] getFiledName(Object obj){ Field fields[]=obj.getClass().getDeclaredFields(); String fieldNames[]=new String[fields.length]; for(int i=0;i

baseModel是适用于整体model的,一个类继承它后就具备可序列化了,然后调用baseModel的toString()方法就能方便的打印类的属性了。

但是LitePal要求的model需要继承DataSupport,同时我又想它具备baseModel的特性,Java中不能直接多继承,于是针对数据库LitePal专属的model诞生了,DataBaseModel代码如下:

package com.android.model;

import org.litepal.crud.DataSupport;

import java.io.Serializable;

/**
 * Title:
 * Description:
 * 

* Created by pei * Date: 2017/11/24 */ public class DataBaseModel extends DataSupport implements Serializable{ private BaseModel baseModel; @Override public String toString() { if(baseModel==null){ baseModel=new BaseModel(); } return baseModel.objectToString(this); } }

DataBaseModel 继承DataSupport,同时具备可序列化和方便打印的功能。ok,下面我们就开始创建person表,写一个Person类,让它继承DataBaseModel ,代码如下:

package com.android.model;

/**
 * Title:
 * Description:
 * 

* Created by pei * Date: 2017/11/23 */ public class Person extends DataBaseModel{ private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

当然,Person类中其实是可以给各属性增加注解的,例如非空,默认值等条件,大家可以在官网上详细去看,这里就不说了

五.在litepal.xml中配置person表


注意Person要写全包名,具体litepal.xml代码如下:



    
    
    
    
    
       

ok,现在LitePal的配置基本完成,现在看看在mainActivity中是如何调用的

六.MainActivity中调用
                //存储
                Person person=new Person();
                person.setName("花花");
                person.setSex("女");
                person.setAge(25);
                //储存状态返回的是布尔值
                boolean save=person.save();
                if(save){
                    LogUtil.e(MainActivity.class,"====存储成功======");
                }else{
                    LogUtil.e(MainActivity.class,"====存储失败======");
                }
                //查询
                List allPersons = DataSupport.findAll(Person.class);
                for (Person p : allPersons) {
                    LogUtil.e(MainActivity.class, "====person======" + p.toString());
                }
七.LitePal数据库混淆
-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.DataSupport {
    *;
}

最后看看打印的数据吧


1.png

ok,今天关于Litepal的配置就讲到这里。谢谢

你可能感兴趣的:(LitePal学习(一)——配置)