1.6版本的的Litepal可以支持了两种加密算法 , AES和MD5
compile 'org.litepal.android:core:1.6.0' //1.6版本新增加了加密
".BaseApplication"
...
/>
//自定义的BaseApplication继承LitePalApplication
public class BaseApplication extends LitePalApplication {
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
}
在assets文件夹下新建litepal.xml文件,包括了数据库的名字,版本,和要映射的数据类型javabean
<litepal>
<dbname value="Info">dbname>
<version value="1">version>
<list>
<mapping class="com.example.leo.litepal.Person"> mapping>
list>
litepal>
注意:javabean中的成员变量只有private修饰才可以映射到数据库中,不想被映射的数据库可以用public 、default 、protected修饰
package com.example.leo.litepal;
import org.litepal.crud.DataSupport;
/**这个javabean就是映射的数据类型,继承DataSupport*/
public class Person extends DataSupport{
private int id;
private String name;
private int age;
private String words;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getWords() {
return words;
}
public void setWords(String words) {
this.words = words;
}
}
如果要新增加一个表 ,新建javabean然后在litepal.xml中增加一项标签就可以了
如果要对前面的一个表升级 , 首先针对原有的javabean升级,然后litepal.xml中的版本号加1
Create
Person p = new Person();
p.setName("leo");
p.setWords("good good study , day day up");
p.setAge(18);
//p.save()的返回值可以判断存储是否成功
if(p.save() ){
Toast.makeText(context, "success", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "error", Toast.LENGTH_SHORT).show();
}
Updata
Person p = new Person();
p.setName("leo");
p.setWords("good good study , day day up");
p.setAge(18+1); //长大了一岁
//针对名字是leo的数据更新
p.updateAll("name = ?","leo");
//全部更新
p.updateAll();
Retrieve
//返回表中所有数据
List<Person> persons = DataSupport.findAll(Person.class);
//返回第一个数据
Person p = DataSupport.findFirst(Person.class);
//返回最后一个数据
Person p = DataSupport.findLast(Person.class);
//select方法用于查询那几列的数据,下面只查询name 和 age两列
List<Person> list = DataSupport.select("name" , "age").find(Person.class);
//下面写一个复杂的连续组合
List<Person> list = DataSupport.select("name","age") //查询name age两列
.where("age > ?","18") //age > 18 的数据
.order("age") //返回的集合以age排序呢
.limit(10) //只要10个数据
.offset(10) //偏移前面10条
.find(Person.class);
Delete
//删除表中name为leo的
DataSupport.deleteAll(Person.class ,"name = ?" , "leo");
转载自郭霖大神的公众号
public class Person extends DataSupport{
private int id;
private String name;
private int age;
//仅仅加下面这一行我们在数据库中存储的就是加密后的数据
@Encrypt(algorithm = AES)
private String words;
//AES加密后的数据是可以进行解密出的,所以我们其他的所以操作都不要改变,Litepal在后台帮我们做好了解密操作,我们查询得到的数据就是明文了
}
注意点
LitePal.aesKey()
MD5算法都只对String类型的字段有效
加密后的数据字段不能再通过where语句来进行查询、修改或删除。也就是说,执行类似于 where(“name = ?”, “leo”) 这样的语句将无法查到任何数据,因为在数据库中存储的真实值已经不是leo了。
MD5是不可逆的,就是说我们加密后的数据不可以通过解密得到原始数据,举一个郭神的例子,用户的密码,我们并不需要知道用户密码是什么,我们只要存一份用户密码的信息熵,然后以后用户登录每次检测输入密码的信息熵是否等于我们保存的就可以了
public class Person extends DataSupport{
private int id;
private String name;
private int age;
//AES 改成 MD5就可以了
@Encrypt(algorithm = MD5)
private String words;
}
怎么做 ?
1.在litepal.xml配置文件中加上<storage/>标签 ,写上相对路径
<storage value="leo/database">storage>
2.申请访问SD卡权限
为什么要移到sd ?
1.方便调试。当手机不root是没有办法进入/data/data/路径看文件的
2.应用卸载后数据不会丢失
菜鸟在大神文章的指导下不断前进~ , 感谢郭霖大神http://blog.csdn.net/sinyu890807/