Litepal是一款android数据库框架,采用了对象关系映射(ORM)的模式。关系映射简单地说就是我们使用的编程语言是面向对象的编程语言,而使用的数据库是关系数据库,那么将面向对象的变成语言和面向关系的数据库之间建立一种映射关系,这就是对象映射关系。它可以让我们以面向对象的思维来操作数据库,而不用再和SQL语句打交道。
要使用LitePal,首先要在app/build.gradle文件中的dependencies闭包中添加如下依赖:
dependencies { compile 'org.litepal.android:core:1.3.2' }1.3.2是版本号的意思,最新的版本号可以在LitePal项目主页上去看。之后便自动下载相应的类库。
接下来就需要配置litepal.xml文件了,把安卓项目的显示方式从android切换成project,新建一个在main下面的assets目录,然在此目录下面新疆一个litepal.xml文件,注意是文件一个文件file不是android resource file,编辑其内容为如下:
<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="BookStore"></dbname><!--dbname指定数据库名--> <version value="1"></version><!--version指定数据库版本号--> <list><!--list用于指定所有的映射类型--> </list> </litepal>
最后还需要配个项目,修改AndroidManifesr.xml中的代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest> <application android:name="org.litepal.LitePalApplication"</application> </manifest>在这里将application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能正常工作。
接下来新建一个Book类:public class Book{ private int id; private String author; private double price; private int pages; private String name; 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 double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } public String getName() { return name; } public void setName(String name) { this.name = name; } }这是一个Java Bean,这个Book类就是数据库中的Book表,而类中的每一个字段分别代表着表中的每一列。接下来需要将Book类添加到映射模型列表中,修改litepal.xml如下<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="BookStore"></dbname> <version value="1"></version> <list> <mapping class="com.example.wanglunhui.litepaltest.Book"></mapping> </list> </litepal>使用<mapping>就是声明我们要配置的映射模型,不管有多少模型类需要映射,都是用相同的方式配置<list>标签即可。接下来只需要任意执行一次数据库操作,BookStore.db(为数据库名,是在litepal.xml中指定的,而表名为Book,也是在litepal中指定的。)修改MainActivity.java如下:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Connector.getDatabase(); } });}}其中调用Connector.getDatabase();就是一次数据库操作,点击一下按钮,数据库就会自动创建成功。
如果我们需要升级一个表Book,向表中添加一个press出版社字段,则只需要把litepal.xml下面的version加1(这里变为2),然后直接在Book中添加一个列
press并添加getter()和setter()方法即可。public class Book{
private String press;public String getPress() { return press; } public void setPress(String press) { this.press = press; }}如果我们还想再添加一张Category表,只需新建一个Category.java类即可:public class Category { private int id; private String categoryName; private int categoryCode; public void setId(int id) { this.id = id; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public void setCategoryCode(int categoryCode) { this.categoryCode = categoryCode; } }然后在litepal.xml中修改版本号:<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="BookStore"></dbname> <version value="2"></version> <list> <mapping class="com.example.wanglunhui.litepaltest.Book"></mapping>在运行程序即可发现运行成功。<mapping class="com.example.wanglunhui.litepaltest.Category"></mapping></list></litepal>使用LitePal来添加数据:只需要创建出模型的实例,再将所有要存储的数据设置好,最后调用一下sava()方法即可。在上面的模型类Book中没有继承结构,LitePal在进行表管理的时候不需要模型结构,但是在进行CRUD操作时就必须要继承自DateSupport类才行。修改Book.java代码如下:package com.example.wanglunhui.litepaltest; import org.litepal.crud.DataSupport; public class Book extends DataSupport {//继承DataSupport即可,下面不需要任何其他方法 //省略了属性和方法 }接着就可以进行数据的添加了,在MainActivity.java:使用LitePal更新数据:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Connector.getDatabase(); } }); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Book book = new Book();//创建Book实例 book.setName("The Da Vinci Code");//调用相应的set()方法 book.setAuthor("Dan Brown"); book.setPages(454); book.setPrice(16.96); book.setPress("Unknow"); book.save();最后sava()一下即可,sava()是从DataSupport中继承而来的 } });}更新数据的方式比较多,现在只介绍常见的几种。首先,最简单的就是用=对已存储的对象重新赋值,然后调用sava()方法。对于LitaPal对象来说,已经存储调用model.isSaved()则返回true。以下两种情况返回true:1.已经调用了model.save()去添加数据,此时model会被认为是已经存储的对象。2.model是通过LitePal的API查询出来的,由于是从数据库中查询出来的,所以认为是已存储的对象。下面用第一种方式进行更新:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);...省略了之前的一些代码Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Book book = new Book(); book.setPrice(14.95);//设置要更新的数据 book.setPress("Anchor"); book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");//更新,可以指定条件 } });}}但是,在使用updateAll()方法的时候,当你想把一个字段用set()设更新为默认值时,比如int默认为0,boolean默认为false,String为null,那么当你new一个对象时,其实所有的字段都是默认值,如pages字段为0。如果想把表中的pages列更新为0,直接调用book.setPages(0)是不行的,因为即使不执行这段代码,pages本身也是0,所以此时LitePal不执行更新操作。对于要更新为默认值的操作,用setToDefault()方法并传入相应的列名即可。如下面代码:Book book=new Book();book.setToDefault("pages");book.updateAll();使用LitePal删除数据:第一种是调用前面所说的已存储对象的delete()方法即可删除,第二种如下:Button deleteButton = (Button) findViewById(R.id.delete_data); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DataSupport.deleteAll(Book.class, "price < ?", "15");//第一个参数为表名,第二个是约束条件,如果没有条件,则删除所有数据} });使用LitePal查询数据:LitePal查询数据十分简单,只需调用一下findAll()即可返回所有数据的Book集合,接下来便可以进行操作了,代码如下:Button queryButton = (Button) findViewById(R.id.query_data); queryButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<Book> books = DataSupport.findAll(Book.class);// for (Book book: books) { Log.d("MainActivity", "book name is " + book.getName()); Log.d("MainActivity", "book author is " + book.getAuthor()); Log.d("MainActivity", "book pages is " + book.getPages()); Log.d("MainActivity", "book price is " + book.getPrice()); Log.d("MainActivity", "book press is " + book.getPress()); } } });除了findAll()以外,还有很多查询的API:Book firstBook=DataSupport.findFirst(Book.class)://查询第一条数据Book lastBook=DataSupport.findLast(Book.class)://查询最后一条数据还可以通过连缀查询来定制更多的查询功能:select()方法用于指定查询哪几列:List<Book> books=DataSupport.select("name","author").find(Book.class)://查询name和author这两列where()方法用于指定查询的约束条件:List<Book> books=DataSupport.where("pric>?","400").find(Book.class)://查询页数大于400的order()方法用于对指定结果进行排序:List<Book> books=DataSupport.order("price desc").find(Book.class)://查询name和author这两列limit()方法用于指定查询结果的数量:List<Book> books=DataSupport.limit(3).find(Book.class)://只查询表中的前3条数据offset()方法用于指定查询的偏移量:List<Book> books=DataSupport.limit(3).offset(1).find(Book.class)://查询表中的第2,3,4条数据,因为偏移为1,所以从1开始对上面方法的任意组合:select()方法用于指定查询哪几列:List<Book> books=DataSupport.select("name","author","pges").where("pages>?","400")
.limit(400)
.offset(10)
.find(Book.class)://查询Book表中的第11~20条满足页数大太阳400的name、author和pages这3列数据并按升序排序。
随后LitePal仍支持原生的SQL语句:Cursor c=DateSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");//结果返回一个Cursor对象,再利用它进行遍历即可。