Android数据库框架--litepal的使用

在写项目的时候遇到了数据库的相关操作,Android 提供的数据库的创建和使用感觉有点小复杂,想着有没有比较好的轮子--框架或者工具类可以使用,结果发现了litepal,一个类似于hibernate,面向对象的方式对数据库进行开发。在万物皆对象的世界,使用起来觉得太爽了。

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

Litepal的使用步骤:

1.Android studio中在gradle文件中添加:

dependencies {
    compile 'org.litepal.android:core:1.3.1'
}
也可以下载jar包,添加到项目中。下载地址同上面的github地址。

2.在assets目录下新建一个litepal.xml文件,该文件是配置文件,litpal根据该文件反射得到相关的信息。

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <pre name="code" class="html">    <!--数据库名-->
<dbname value=" xxx" ></dbname>
<pre name="code" class="html">    <!--数据库版本号-->

 <version value="1" ></version> <!-- 下面的list是创建数据库表对应的models,litepal会根据这里的类,通过反射的方式去创建表。在类中,只有private属性对应的字段会写入表中的列,其他的不会。例如下面的会创建两个表。 <list> <mapping class="com.test.model.Reader"></mapping> <mapping class="com.test.model.Magazine"></mapping> </list> -->我的项目中创建了一张表。  <list> <mapping class="com.wjustudio.phoneManager.javaBean.BlackNumInfo"></mapping> </list></litepal> 
 3.配置LitepalApplication,原因是数据库的操作需要context,配置了LitepalApplication,就不使用context。 

   配置如下:

   

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

如果已经有了一个application,可以让这个application继承LitePalApplication,如在我的项目中:

/**
 * 作者:songwenju on 2016/4/13 21:48
 * 邮箱:songwenju01@163.com
 */

public class BaseApplication extends LitePalApplication {

    public static Handler getAppHandler() {
        Looper.prepare();
        return new Handler();
    }
}
看了一下LitePalApplication的源码,继承这个Application可以使用个tConext获得全局的context,源码如下:

       /**
	 * 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中的。如下是我的项目中的:

package com.wjustudio.phoneManager.javaBean;

import org.litepal.crud.DataSupport;

/**
 * songwenju on 16-4-20 : 12 : 23.
 * 邮箱:songwenju@outlook.com
 */
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给的例子是这样的:

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<Song> allSongs = DataSupport.findAll(Song.class);
查询满足条件的:

List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);

我的项目用的是MVP的设计模式,下面附上代码:


package com.wjustudio.phoneManager.biz;

import com.wjustudio.phoneManager.javaBean.BlackNumInfo;

import java.util.List;

/**
 * songwenju on 16-4-20 : 12 : 27.
 * 邮箱:songwenju@outlook.com
 */
public interface IBlackNumBiz {
    /**
     * 获得所有的黑名单
     * @return
     */
    List<BlackNumInfo> 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);

}

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.
 * 邮箱:songwenju@outlook.com
 */
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<BlackNumInfo> getAllBlackNum() {
        return DataSupport.findAll(BlackNumInfo.class);
    }

    @Override
    public void insertBlackNum(BlackNumInfo blackNumInfo) {
        blackNumInfo.saveThrows();
    }

    @Override
    public BlackNumInfo getBlackNumInfo(String blackNum) {
        List<BlackNumInfo> 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<BlackNumInfo> blackNumInfos = DataSupport.where("blackNum = ?", blackNum).find(BlackNumInfo.class);

        return blackNumInfos !=null && blackNumInfos.size()> 0;
    }


}
这样在项目中可以使用BlackNumBizImpl的对象对数据库进行增删改查了。


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值