一。配置LitePal
在Github上搜索这个开源项目,找到在gradle中添加的语句
compile 'org.litepal.android:core:1.4.1'
1.4.1是我现在的最新版本。
添加后需要配置litepal.xml:
在src/main目录下创建一个assets目录,在此目录下创建一个litepal.xml文件,对此文件进行编辑。
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="GameStore"></dbname>
<version value="1"></version>
<list>
</list>
</litepal>
注意:此处要创建xml文件需要在assets目录下New一个File,命名为litepal.xml
<daname>表示数据库的名称,<vewsoin>表示版本号,<list>用于指定所有的映射模型
接下来需要配置AndroidManifest.xml文件:
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
在application中加入android:name=“”的代码。
配置结束。
二。创建数据库
1.建立一个java.bean
public class Game {
private int id;
private String author;
private String name;
private double price;
private boolean like;
public boolean isLike() {
return like;
}
public void setLike(boolean like) {
this.like = like;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
2.修改litepal.xml文件,在<list>标签里加入下面语句:
<list>
<mapping class = "com.firstcode.firstcode2.chapter6.SQLiteTest.LitePalPackage.Game"></mapping>
</list>
映射到java.bean文件。
3.运行创建数据库
在需要创建数据库地方使用:
Connector.getDatabase();
即可创建一个数据库。
三。升级数据库
需求:在Game表中添加一个字段press,并创建一个新的表格:Categroy
1.添加字段press只需要在Game的Bean文件中加一个成员变量即可
//新增字段,出版社
private String press;
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
2.新建表格只需新创建一个Categroy的Bean类即可:
public class Categroy {
private int id;
private String categroyName;
private int categroyCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategroyName() {
return categroyName;
}
public void setCategroyName(String categroyName) {
this.categroyName = categroyName;
}
public int getCategroyCode() {
return categroyCode;
}
public void setCategroyCode(int categroyCode) {
this.categroyCode = categroyCode;
}
}
3.在litepal.xml文件里声明这个Bean
<list>
<mapping class = "com.firstcode.firstcode2.chapter6.SQLiteTest.LitePalPackage.Game"></mapping>
<mapping class = "com.firstcode.firstcode2.chapter6.SQLiteTest.LitePalPackage.Categroy"></mapping>
</list>
4.执行命令也没有变,直接是
Connector.getDatabase();
用Listepal的好处是,在更新数据库的时候,不会造成数据丢失。
四。使用LitePal添加数据
只需创建的模型类的实例,再讲所有要存储的数据设置好,最后调用一下save()方法即可。
1.把需要用到的Bean类继承DataSupport:
public class Game extends DataSupport{
2.想Game表中添加数据:
Game game = new Game();
game.setName("WOW");
game.setAuthor("BoLiZha");
game.setPress("Press:BoLiZha");
game.setPrice(60.0);
game.setLike(true);
game.save();
只需要向Bean中set数据即可,最后调用save()方法。
3.如果需要连续添加多条记录,需要在每个save()方法后加入clearSaveState()方法:
Game game = new Game();
game.setName("WOW");
game.setAuthor("BoLiZha");
game.setPress("Press:BoLiZha");
game.setPrice(60.0);
game.setLike(true);
game.save();
game.clearSavedState();
game.setName("WOT");
game.setAuthor("LaoMaoZi");
game.setPress("Press:KongZhongWang");
game.setPrice(36.0);
game.setLike(true);
game.save();
game.clearSavedState();
game.setName("LOL");
game.setAuthor("QuanTou");
game.setPress("Press:QiEr");
game.setPrice(0.0);
game.setLike(true);
game.save();
五。使用LitePal更新数据:
在LitePal中,对已经存储过的数据才能进行更新,也就是说只能对model.isSaved()如果返回true才能更新。
在以下两种情况会返回true,第一种是:已经调用过model.save()的数据,另一种是通过LitePal提供的AIP在数据库中查询到的数据。
1.第一种情况:
game.setName("CrossFire");
game.setAuthor("LaJi");
game.setPress("Press:QiEr");
game.setPrice(0.0);
game.setLike(true);
game.save();
game.setPrice(1000000.0);
game.setLike(false);
game.save();
就是对已经存储的数据进行再次更新再存储。
2.第二种情况
game.setPrice(2000000.0);
game.setAuthor("LaJiZhongDeZhanDouJi");
game.updateAll("name = ? and author = ?", "CrossFire", "LaJi");
updateAll()方法可以指定一个约束条件,和SQL语句里面的where相类似。
注意:在updateAll()方法使用时,如果想要指定字段的默认值的话,不能用Bean 的set方法,这样做的话是不会更新的,因为在java中,所有字段都是有默认值的,例如一个int类型的page默认值是0,如果直接set(0)的话,这样即使更新之后,这个语句也不能运行。需要用LitePal提供的setToDefault()方法。
如果在updateAll()方法使用时,没有指定约束条件,则是对所有数据进行更新,例如:
game.setToDefault("price");
game.updateAll();
这两行的意思就是把所有条目的price字段置为默认值。
3.指定id进行更新数据:
game.update(3);
六。使用LitePal删除数据:
删除的方法和更新的方法类似,也是两种,一种是直接对已经存储(调用过save()的对象或者是通过LitePal的AIP查找出来的)的对象delete()。
另一种:
1.有条件的删除
DataSupport.deleteAll(Game.class, "price > ?", "1000000.0");
2.指定id删除
DataSupport.delete(Game.class, 3);
七。使用LitePal查询数据:
查询的方法也并不复杂:
List<Game> games = DataSupport.findAll(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
Log.e("LitePalTest", game1.getPress());
Log.e("LitePalTest", game1.getPrice() + "");
Log.e("LitePalTest", game1.isLike() + "");
}
只需要用DataSupport的findAll()方法查找,然后在对这个对象进行遍历拿到数据就可。
findFirst()和findLast()则是可以查询数据库的首项和尾项:
Game gameFirst = DataSupport.findFirst(Game.class);
Log.e("gameFirst", gameFirst.getName());
Log.e("gameFirst", gameFirst.getAuthor());
Log.e("gameFirst", gameFirst.getPress());
Log.e("gameFirst", gameFirst.getPrice() + "");
Log.e("gameFirst", gameFirst.isLike() + "");
Game gameLast = DataSupport.findLast(Game.class);
Log.e("gameLast", gameLast.getName());
Log.e("gameLast", gameLast.getAuthor());
Log.e("gameLast", gameLast.getPress());
Log.e("gameLast", gameLast.getPrice() + "");
Log.e("gameLast", gameLast.isLike() + "");
select()方法可以和find()一起使用,根据关键字查找特定数据,这里值查找name和author这两项数据:
List<Game> games = DataSupport.select("name", "author").find(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
}
where()方法可以指定查询的约束条件,这里查询price大于40的数据:
List<Game> games = DataSupport.where("price > ?", "40").find(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
Log.e("LitePalTest", game1.getPress());
Log.e("LitePalTest", game1.getPrice() + "");
Log.e("LitePalTest", game1.isLike() + "");
}
order()方法可以为查询到的数据进行排序,desc是降序,asc是升序,这里查询到的数据根据price的降序排列:
List<Game> games = DataSupport.order("price desc").find(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
Log.e("LitePalTest", game1.getPress());
Log.e("LitePalTest", game1.getPrice() + "");
Log.e("LitePalTest", game1.isLike() + "");
}
limit()方法可以查询到数据库的前几列数据:
List<Game> games = DataSupport.limit(2).find(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
Log.e("LitePalTest", game1.getPress());
Log.e("LitePalTest", game1.getPrice() + "");
Log.e("LitePalTest", game1.isLike() + "");
}
offset()方法可以指定从什么位置进行查询,结合limit()方法,例如:
List<Game> games = DataSupport.limit(2).offset(1).find(Game.class);
for (Game game1 : games) {
Log.e("LitePalTest", game1.getName());
Log.e("LitePalTest", game1.getAuthor());
Log.e("LitePalTest", game1.getPress());
Log.e("LitePalTest", game1.getPrice() + "");
Log.e("LitePalTest", game1.isLike() + "");
}
这个方法则是查询数据库的前两项数据,从第二个条目开始查询。
上面几个方法可以进行连缀组合。
当然LitePal也支持老式的SQL语句,但是LitePal正是要进行简化操作的。所以...