在写项目的时候遇到了数据库的相关操作,Android 提供的数据库的创建和使用感觉有点小复杂,想着有没有比较好的轮子–框架或者工具类可以使用,结果发现了litepal,一个类似于hibernate,面向对象的方式对数据库进行开发。在万物皆对象的世界,使用起来觉得太爽了。
LitePal是一款开源的android数据库框架(https://github.com/LitePalFramework/LitePal),它采用了对象关系映射(ORM)的模型,把对数据库的操作转换为对对象的操作。
Litepal的使用步骤:
1.Android studio中在gradle文件中添加:
[java] view plain copy
dependencies {
compile 'org.litepal.android:core:1.3.1'
}
也可以下载jar包,添加到项目中。下载地址同上面的github地址。
2.在assets目录下新建一个litepal.xml文件,该文件是配置文件,litpal根据该文件反射得到相关的信息。
[html] view plain copy
[html] view plain copy
我的项目中创建了一张表。
3.配置LitepalApplication,原因是数据库的操作需要context,配置了LitepalApplication,就不使用context。
配置如下:
看了一下LitePalApplication的源码,继承这个Application可以使用个tConext获得全局的context,源码如下:
[java] view plain copy
/**
* Get the global application context.
*
* @return Application context.
* @throws org.litepal.exceptions.GlobalException
*/
public static Context getContext() {
if (sContext == null) {
throw new GlobalException(GlobalException.APPLICATION_CONTEXT_IS_NULL);
}
return sContext;
}
如果你的application还有一层继承关系,比如
public class MyOwnApplication extends BaseApplication { … }
这个时候可以使用下面的方法去注册:
public class MyOwnApplication extends BaseApplication { @Override public void onCreate() { super.onCreate(); LitePalApplication.initialize(this);
} … }
4.建表,新建一个类继承DataSupport,该DataSupport是litepal中的。如下是我的项目中的:
[java] view plain copy
package com.wjustudio.phoneManager.javaBean;
import org.litepal.crud.DataSupport;
/**
* songwenju on 16-4-20 : 12 : 23.
* 邮箱:[email protected]
*/
public class BlackNumInfo extends DataSupport{
private String blackNum;
private int mode;
public String getBlackNum() {
return blackNum;
}
public void setBlackNum(String blackNum) {
this.blackNum = blackNum;
}
public int getMode() {
return mode;
}
public void setMode(int mode) {
this.mode = mode;
}
public BlackNumInfo() {
}
@Override
public String toString() {
return "BlackNumInfo{" +
"blackNum='" + blackNum + '\'' +
", mode=" + mode +
'}';
}
}
数据库的升级,就在类里面添加一些字段,修改之前配置的xml的版本号。
5.对数据库表的curd操作
1) 保存数据,调用对象的save方法
2)修改数据,分情况:如果知道id的话先使用find,再使用save。github给的例子是这样的:
[java] view plain copy
Album albumToUpdate = DataSupport.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();
如果想修改全部的数据:
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price albumToUpdate.update(id);
或者是有一定的条件的数据,这里面虽然也用updateAll,更新满足条件的所有数据,如果条件是主键或者是唯一列相关的,就相当于修改了一条数据。
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price albumToUpdate.updateAll(“name = ?”, “album”);
3)删除
知道Id:
DataSupport.delete(Song.class, id);
删除满足条件的数据:
DataSupport.deleteAll(Song.class, “duration > ?” , “350”);
4)查询数据
知道Id:
Song song = DataSupport.find(Song.class, id);
查询全部:
List allSongs = DataSupport.findAll(Song.class);
查询满足条件的:
List songs = DataSupport.where(“name like ?”, “song%”).order(“duration”).find(Song.class);
我的项目用的是MVP的设计模式,下面附上代码:
[java] view plain copy
package com.wjustudio.phoneManager.biz;
import com.wjustudio.phoneManager.javaBean.BlackNumInfo;
import java.util.List;
/**
* songwenju on 16-4-20 : 12 : 27.
* 邮箱:[email protected]
*/
public interface IBlackNumBiz {
/**
* 获得所有的黑名单
* @return
*/
List getAllBlackNum();
/**
* 添加一个黑名单
* @param blackNumInfo
*/
void insertBlackNum(BlackNumInfo blackNumInfo);
/**
* 通过电话号码获得一个blackNumInfo
* @param blackNum
*/
BlackNumInfo getBlackNumInfo(String blackNum);
/**
* 删除黑名单信息
* @param blackNumInfo
*/
void deleteBlackNum(BlackNumInfo blackNumInfo);
/**
* 升级黑名单信息
* @param blackNumInfo
*/
void updateBlackNum(BlackNumInfo blackNumInfo);
/**
* 黑名单信息是否存在
* @param blackNum
* @return
*/
boolean isExist(String blackNum);
}
[java] view plain copy
package com.wjustudio.phoneManager.biz;
import android.content.ContentValues;
import com.wjustudio.phoneManager.javaBean.BlackNumInfo;
import org.litepal.crud.DataSupport;
import java.util.List;
/**
* songwenju on 16-4-20 : 13 : 23.
* 邮箱:[email protected]
*/
public class BlackNumBizImpl implements IBlackNumBiz {
public static final int BLACK_NUM_PHONE = 1;
public static final int BLACK_NUM_SMS = 2;
public static final int BLACK_NUM_ALL = 3;
@Override
public List getAllBlackNum() {
return DataSupport.findAll(BlackNumInfo.class);
}
@Override
public void insertBlackNum(BlackNumInfo blackNumInfo) {
blackNumInfo.saveThrows();
}
@Override
public BlackNumInfo getBlackNumInfo(String blackNum) {
List blackNumInfos = DataSupport.where("blackNum = ?", blackNum).find(BlackNumInfo.class);
return blackNumInfos.get(0);
}
@Override
public void deleteBlackNum(BlackNumInfo blackNumInfo) {
if (!blackNumInfo.isSaved()) {
blackNumInfo.save();
}
blackNumInfo.delete();
}
@Override
public void updateBlackNum(BlackNumInfo blackNumInfo) {
ContentValues values = new ContentValues();
values.put("mode", blackNumInfo.getMode());
DataSupport.updateAll(BlackNumInfo.class, values, "blackNum = ?", blackNumInfo.getBlackNum());
}
@Override
public boolean isExist(String blackNum) {
List blackNumInfos = DataSupport.where("blackNum = ?", blackNum).find(BlackNumInfo.class);
return blackNumInfos !=null && blackNumInfos.size()> 0;
}
}
这样在项目中可以使用BlackNumBizImpl的对象对数据库进行增删改查了。