Litepal是一个轻型的数据库操作框架,运用ORM对象映射模型,所有的数据库操作都通过对象直接进行操作,可以大大简化数据的存储与维护过程。项目地址,传送门。
eclipse开发环境:首先下载jar,建议下载最新版本的,然后放入你新建工程的libs中
AndroidStudio开发环境:修改你新建工程的build.gradle,增加一个新的依赖库,如下:
dependencies {
compile 'org.litepal.android:core:1.3.2'
}
注意在Android studio中要一定要新建一个assets文件夹,然后在里面创建名为litepal的xml文件,如果litepal.xml新建在res/raw中,则会无法识别。
<litepal>
<dbname value="userinf" >dbname>
<version value="1" >version>
<list> list>
litepal>
由于操作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样操作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的数据库操作就都不用再传Context了,如下所示:
"org.litepal.LitePalApplication"
...
>
...
当然,有些程序可能会有自己的Application,并在这里配置过了。比如说有一个MyApplication,如下所示:
"com.example.MyApplication"
...
>
...
没有关系,这时只需要修改一下MyApplication的继承结构,让它不要直接继承Application类,而是继承LitePalApplication类,就可以使用一切都能正常工作了,代码如下所示:
public class MyApplication extends LitePalApplication {
...
}
但是,有些程序可能会遇到一些更加极端的情况,比如说MyApplication需要继承另外一个AnotherApplication,并且这个AnotherApplication还是在jar包当中的,不能修改它的代码。这种情况应该算是比较少见了,但是如果你遇到了的话也不用急,仍然是有解释方案的。你可以把LitePal的源码下载下来,然后把src目录下的所有代码直接拷贝到你项目的src目录下面,接着打开LitePalApplication类,将它的继承结构改成继承自AnotherApplication,再让MyApplication继承自LitePalApplication,这样所有的Application就都可以在一起正常工作了。
仅仅三步,我们就将所有的配置工作全部完成了,并且这是一件一本万利的事情,自此以后,你就可以开心地体验LitePal提供的各种便利了,就让我们从建表开始吧。
public class User extends DataSupport {
private int userId;
private String loginName;
private String loginPassword;
private int role;
private int createId;
private Date createTime;
private int updId;
private Date updTime;
//记得添加所有字段的getter和setter方法
}
litepal支持的实体类字段映射类型为
int,long,double,float,byte[],boolean,String,Date;
注意不支持String[]数组型。
假如设置实体类的一个字段为id,类型是字符型,会报错么?
private String id;
运行之后报了如下异常
org.litepal.exceptions.DataSupportException: id type is not supported. Only int or long is acceptable for id
com.example.hapzhu.andrioddemotest W/System.err: at org.litepal.crud.DataSupport.saveThrows(DataSupport.java:1870)
com.example.hapzhu.andrioddemotest W/System.err: at org.litepal.crud.DataSupport.save(DataSupport.java:1802)
意思是如果字段名为id,类型只能为int或者long。
User user = new User();
user.setUserId(8);
user.setLoginName("admin");
//判断数据库是否存在该条记录,不存在则插入
if (user.saveIfNotExist("userId = ? ", "8")) {
Toast.makeText(this, "存储成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "存储失败", Toast.LENGTH_SHORT).show();
}
//删除数据库中User表的所有记录
DataSupport.deleteAll(User.class);
//删除数据库User表中id为1的记录
User user = DataSupport.find(User.class,1);
if(user.isSaved()){
if(user.delete(User.class,1) > 0 ){
showToast("删除成功");//自己封装的方法
}else{
showToast("删除失败");
};
//删除数据库user表中id大于1的记录
DataSupport.deleteAll(User.class, "id> ?" , "1");
方法一
//第一步,查找id为1的记录
User user = DataSupport.find(User.class, 1);
//第二步,改变某个字段的值
user.setUserId(10);
//第三步,保存数据
user.save();
方法二
User user = new User();
user.setLoginName("admin");
//直接更新id为1的记录
user.update(1);
方法三
User user = new User();
user.setLoginName("admin");
//更新userid为1的记录,将loginName字段设为admin
movie.updateAll("userid = ?", "1");
//查找movie表的所有记录
List allMovies = DataSupport.findAll(Movie.class);
//查找movie表id为1的记录
Movie movie = DataSupport.find(Movie.class,1);
更多具体详见 http://blog.csdn.net/qq_38414907/article/details/76257249
异步操作适用于数据量特别大的操作,可能需要比较久的时间去操作数据库,这时就可以用子线程来完成数据库操作。
注意这是1.5.1之后才添加的方法,所有增删改查都可以用异步操作,只需在方法名后拼接上async这个关键词即可。
//异步查询所有电影数据
DataSupport.findAllAsync(User.class).listen(new FindMultiCallback() {
@Override
public void onFinish(List t) {
List allUsers= (List) t;
}
});
//异步保存数据至数据库
user.saveAsync().listen(new SaveCallback() {
@Override
public void onFinish(boolean success) {
}
});
原理就是在实体类中添加其它类的对象,其实就是这表中添加了一个外表的主键,这样就把它们给关联起来了。
更多具体详见 http://blog.csdn.net/qq_38414907/article/details/76230444