Android学习|LitePal操作数据库
《第一行代码》系列读书笔记
1.LitePal简介
2.配置LitePal
3.创建和升级数据库
4.添加数据
5.更新数据
6.删除数据
7.查询数据
1.LitePal简介
- LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。
什么是关系映射,简单的说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射了,对象关系映射模式,就是可以用面向对象的思维来操作数据库,而不用再和SQL语句打交道。
2.配置LitePal
-
1.编辑app/build.gradle文件,在dependencies闭包中添加如下内容:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:25.3.1' testCompile 'junit:junit:4.12' compile 'org.litepal.android:core:1.4.1'//版本号 }
2.配置litepal.xml文件,右击app/src/main目录–New–Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,然后编辑
<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="BookStore" ></dbname>//数据库名 <version value="1" ></version>//数据库版本号 <list>//所有的映射模型 </list> </litepal>
3.配置一下LitePalApplication,修改AndroidManifest.xml中的代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.litepaltest"> <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> </manifest>
这里将项目的application配置为org.litepal.LitePalApplication。
3.创建和升级数据库
-
使用LitePal,用面向对象的思维来创建一张Book表,定义一个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.litepaltest.Book"></mapping>//声明我们要配置的映射模型类 </list> </litepal>
修改MainActivity代码
Button createDatabase = (Button)findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Connector.getDatabase(); //简单的数据库操作,只要点击一下按钮,数据库就会自动创建完成. } });
使用SQLiteOpenHelper来升级数据库,有一个问题就是升级数据库的时候我们需要先把之前的表drop掉,然后再重新创建才行,这其实是一个非常严重的问题,因为这样会造成数据丢失,每当升级一次数据库,之前表中的数据就全没了。
当使用LitePal时,这些都不再是问题了.使用LitePal来升级数据库非常非常简单,你完全不用考虑任何的逻辑,只需要改你想改的内容,然后版本号加1就可以了比如我们想要向Book表中添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段
public class Book { ... private String press; ... public String getPress() { return press; } public void setPress(String press) { this.press = press; } }
如果我们还想再添加另一张表,那么只需要新建一个类就可以了
改完了所有我们想改的东西,只需要记得将版本号加1就行了.这里添加一个新的模型类,因此也需要将它添加到映射模型列表中,修改litepal.xml中的代码。
4.使用LitePal添加数据
-
使用LitePal添加数据,只需要创建出模型类的实例,然后将所有的要存储的数据设置好,最后调用一下save()方法就可以了
模型类必须继承DataSupport类,修改Book类public class Book extends DataSupport{ ... }
修改MainActivity代码
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"); book.setAuthor("Dan Brown"); book.setPages(454); book.setPrice(16.96); book.setPress("Unknow"); book.save(); //数据添加 } });
5.使用LitePal更新数据
-
首先,最简单的一种更新方式就是对已存储的对象重新设值,然后重新调用save()方法。什么是已存储的对象,对于LitePal来说,对象是否已存储就是根据调用**model.isSaved()**方法的结果来判断的,返回true就表示已存储,返回false就表示未存储。
第一种情况的代码,修改MainActivity代码
Button updateData = (Button)findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Book book = new Book(); book.setName("The Lost Symbol"); book.setAuthor("Dan Brown"); book.setPages(510); book.setPrice(19.95); book.setPress("Unknow"); book.save(); book.setPrice("10.99"); book.save(); } });
在更新数据按钮的点击事件里面,首先添加一条Book数据,然后调用setPrice()方法将这本书的价格进行修改,之后再调用了**save()**方法.此时LitePal会发现当前的Book对象是已存储的,因此不会再向数据库中去添加一条新的数据,而是会直接更新当前的数据.
另外一种更新方法,修改MainActivity代码
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");
}
});
}
这里首先new一个Book实例,然后直接调用setPrice()方法和setPress()方法来设置要更新的数据,最后再调用*updateAll()方法去执行更新操作。
对于所有想要将为数据更新成默认值的操作,LitePal提供了一个setToDefault()*方法,然后传入相应的列名就可以了实现了。
6.使用LitePal删除数据
-
第一种是直接调用已存储对象的delete()方法就可以了。 另一种删除方式的代码如下: 修改MainActivity代码:
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"); } }); }
这里调用DataSupport.deleteAll()方法来删除数据,其中deleteAll()方法的第一个参数用于指定删除哪张表中的数据,后面的参数用于指定约束条件。
deleteAll()方法不指定约束条件,就是要删除表中的所有数据
7.使用LitePal查询数据
-
LitePal查询表中的所有数据:
List<Book> books = DataSuppport.findAll(Book.class);
findAll()方法返回一个Book类型的List集合,我们不用像之前那样通过Cursor对象一行行去取值,LitePal已经自动帮助我们完成了赋值操作.
修改MainActivity代码:Button queryButton = (Button)findViewById(R.id.query_data); queryButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ List<Book> books = DataSuppport.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()); } } }); }
查询Book表中的第一条数据可以这样写:
Book firstBook = DataSuppport.findFirst(Book.class);
查询Book表中的最后一条数据可以这样写
Book lastBook = DataSuppport.findLast(Book.class);
我们可以通过连缀查询来定制更多的查询功能
select()方法用于指定查询那几列的数据,对应了SQL当中的select关键字,比如只查询name和author这两列的数据List<Book> books = DataSuppport.select("name", "author").find(Book.class);
where()方法用于指定查询的约束条件,对应了SQL当中的关键字where,比如只查询页数大于400的数据,
List<Book> books = DataSuppport.where("pages > ?", "400").find(Book.class);
order()方法用于指定结果的排序方式,对应了SQL当中的order by 关键字,比如将查询结果按照书价格从高到低排序
desc表示降序排列,asc或者不写表示升序排列List<Book> books = DataSuppport.order("price desc").find(Book.class);
limit()方法用于指定查询结果的数量,比如只查询表中的前3条数据
List<Book> books = DataSuppport.limit(3).find(Book.class);
offset()方法用于指定查询结果的偏移量,比如查询表中的第2条,第3条,第4条数据
List<Book> books = DataSuppport.limit(3).offset(1).find(Book.class);
还可以对这5个方法进行任意组合的连缀,来完成一个比较复杂的查询操作
查询Book表中第11–20条满足页数大于400这个条件的name,author和pages这3列数据,并将查询结果按照页数升序排列List<Book> books = DataSuppport.select("name", "author", "pages") .where("pages > ?", "400") .order("pages") .limit(20) .offset(10) .find(Book.class);
LitePal也支持使用原生的SQL来查询:
Cursor c = DataSupport.findBySQL("select * from Book where pages > ? and price < ?", "400", "20");
调用DataSupport.findBySQL()方法来进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值,注意findBySQL()方法返回的是一个Cursor对象,需要将数据一一取出才行。
上一篇: 禁用spotlight
下一篇: 几个工厂模式初识