新手日记,希望和我一样的小白看了之后有一些收获,也希望有人可以帮我发现问题!可以帮我更深入原理,本人纯小白!
目录
LitePal就是一个库,那库是什么?回想一下在IDEA中的library,好像就是一个库,然后我们会将很多jar包加到里面,比如我们会将mysql的jar加进去,然后可以直接利用库中里面的各种类。这个LitePal就是一个开源库,我们在github上面拿到的。
然后它采用的是对象关系映射(orm)的模式,对象关系映射,是一种面向对象的思想。
它的用处就是我们可以以面向对象的思想对数据进行crud操作,而不用写错误频出的sql语句就可以直接操作当前app下的数据库了,进行数据库表的创建和升级,以及对数据的crud。极大程度上提高了开发的效率。
其实在这里就是定义java类(实体类,javabean),当成数据库里面的一张表,并且这个类中的属性就是表里面的字段,对属性值操作就是对表里面的数据进行操作!
因为这并不是安卓中自带的,很多不是安卓自带的就是需要引入进来才能使用的。像androidx,这些都是……都是需要导入进来的。
2.2.1 首先在github上面找到这个库的像地址一样的东西,然后版本号这些。
'org.litepal.guolindev:core:3.2.3' 【疑问】这里的org是什么意思,有点熟悉……,好像和com是一样的东西,域名?
2.2.2 在app目录下的build.gradle中一个闭包中进行配置,也被叫做添加依赖
implementation 'org.litepal.guolindev:core:3.2.3'。org.litepal.guolindev都是一样的,应该就是和com.example.litepaltest差不多,后面的core是版本号。
2.2.3 然后需要在/app/src/main/下面建立一个资产assets目录,其实这也就代表着这是属于我们的“资产”,我们可以用了。
2.2.4 然后在资产目录下建立一个litepal.xml文件(这里需要注意建立一个普通文件然后结尾命名.xml就行了,不要用as中快捷方式创建Android Resource File.xml)
2.2.5 然后在litepal.xml中配置信息,表示这个就是我们要用litepal操作的数据库和一些表!
dbname表示我们用这个Litepal来操作的某个数据库,version表示版本,list下面就是我们要操作的表了,只不过是一个javabean的对象的形式存在的,这也是这个litepal的特色了。mapping就是映射的意思!一个类映射一个表,类的属性映射表的字段!
<?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>
2.2.6 最后需要在application的清单文件里面表示添加一个name属性,这样我们当前这个应用就可以使用这个LitePal了。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.litepaltest">
<application
android:name="org.litepal.LitePalApplication"
…………
</application>
</manifest>
完成以上的操作,那么我们就算可以使用这个LitePal对我们的库和表进行初始化(创建,升级)的操作了。
相比起之前的复杂步骤,使用LitePal创建数据库只需要一行代码。但是在创建之前我们先要保证这个数据库没有被创建过啊,它才会创建。并且需要提前在assets目录下的litepal.xml文件中声明数据库的名称<dbname>还有表的名称<mapping>,版本号<version>。然后在任何地方调用Connector.getDatabase()方法就会返回一个这个数据库对象了,如果这个数据库没有创建那么就会去创建了,但是如果创建过就不会在创建了。底层应该就是去调用了构造方法创建库和当中的onCreate方法初始化库,这里相当于进行了封装。
下面为一个javabean类,对应的就是一个表。
public class Book {
private int id;
private String author;
private double price;
private int pages;
private String name;
//set和get方法……
调用Connector.getDatabase()方法就会返回一个可写的数据库对象了,如果不存在这个数据库,那么就会创建一个。Connector:The connector to connect database provided by LitePal. Users can use this class to get the instance of SQLiteDatabase.一个由LitePal提供来和数据库进行连接的类,通过它可以拿到一个SQLiteDatabase实例。
8.15更新:现在是直接使用LitePal.getDatabase()方法来返回一个可写的数据库操作对象了!注意学习最新的官方文档:https://codechina.csdn.net/mirrors/litepalframework/litepal?utm_source=csdn_github_accelerator
create_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();
});
升级数据主要就是体现在两个方面:1 为库中添加新表 2为原来的表添加新的字段。
添加新类,其实就是添加新表
public class Category {
private int id;
private String CategoryName;
private String CategoryCode;
//set和get方法
为原来的类添加属性,其实就是为原来的表添加字段
public class Book extends LitePalSupport {
private int id;
private String author;
private double price;
private int pages;
private String name;
private String press;//新字段
然后想要升级,其实底层也就是想让onUpdate方法执行,那么就得让系统检测到版本发生了变化,那么此时我们就要在LitePal.xml文件中对版本进行更改了。并且添加多了一张表就多了一个映射关系,也需要在里面添加。
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore" ></dbname>
<version value="2" ></version>
<list>
<mapping class="com.example.litepaltest.Book"></mapping>
<mapping class="com.example.litepaltest.Category"></mapping>
</list>
</litepal>
然后再次执行Connector.getDatabase()方法时,系统发现发生版本号发生了变化,然后就会去执行onUpdate()方法了。
update_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();
}
});
然后以上操作,就将数据库创建和数据库升级利用Connector.getDatabase()方法执行完毕了,接下来就是要对数据库进行crud操作了。
1、首先需要先让我们的java类,也就是对应库中的表的java类来继承LitePalSupport。LitePalSupport:LitePalSupport connects classes to SQLite database tables ;这个类用来连接数据库中的表。 In the context of an application, these classes are commonly referred to as models. ;这些类也被称作模型;LitePalSupport relies heavily on naming in that it uses class and association names to establish mappings between respective database tables;LiteSupport非常依赖于命名,也就是类名就是表名。(注意这里已经和书里面的不一样了,DataSupport已经废弃了)
import org.litepal.crud.LitePalSupport;
public class Book extends LitePalSupport{
//代码片段
}
2、然后我们需要创建这个类的对象,因为它继承自LiteSupport,说明它也是一个LiteSupport了。那么这个对象就可以操作与之类名一样的表了。然后调用这个对象的set方法,为这个表的字段添加数据,最后记得要用save()方法来保存!非常好理解。
add_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book = new Book();
book.setId(1);
book.setName("how to win");
book.setPages(600);
book.setPrice(12.5);
book.setPress(null);
book.save();
}
});
这样数据就被添加进去了,采用adb命令就可以发现这个数据库里面的这个表有数据了。
有好几种方法,有一点很重要,就是哪个库中的哪个表一定要知道在哪里指明了,这里库就是在LitePal.xml中指明了,表就是用类名来指明了。
1 第一种就是在找到那个原来的存储对象来对里面的数据进行更新,再次save会覆盖。
2 第二种就是调用这个对象的updateAll()方法,更新所有符合我们写的条件的条目。
3 第三种是最新的,就是直接用LitePal来直接进行操作(和删除操作一样,都是最新的,两个方法,一个根据id删一条,一个根据条件删除全部符合条件的)。
update_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 更新表中数据的第一种方式
// Book book = new Book();
// book.setName("how to fail");
// book.setPages(1);
// book.setPrice(199.9);
// book.setAuthor("jackson li");
// book.setPress("unknown");
// book.save();
// book.setAuthor("jack ma");
// book.save();
// 更新表中数据的第二种方式
Book book = new Book();
book.setAuthor("jack chen");
book.setPrice(299.9);
book.updateAll("name=? and author=?","how to fail","jack ma");
}
});
删除数据也和书中的不一样了,主要就是用LitePal直接进行单个的删除,或者有条件的删除。调用delete()方法和deleteAll()方法。
deleteAll()参数说明:第一个是肯定就是表名,第二个就是where,第三个就是where中的问号的值。
delete()方法就是一个表名,一个id。
delete_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LitePal.deleteAll(Book.class,"price<?","20");
}
});
查询数据也是直接利用LitePal就可以了。调用LitePal的find和findAll()方法。find找到的是一个javabean对象,然后findAll可以通过条件来找,返回的是一个集合。
query_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//第一种 查找一条 传入表的名称 传入要查条目的id
// Book book = LitePal.find(Book.class,2);
// Log.d(TAG, "作者姓名"+book.getAuthor());
//第二种 查找全部
// List<Book> books = LitePal.findAll(Book.class);
// for (Book book:books) {
// Log.d(TAG, "书名:"+book.getName());
// }
//第三种 查找所有符合条件的
List<Book> books = LitePal.where("name=?","how to fail").find(Book.class);
for (Book book:books){
Log.d(TAG, "书名:"+book.getName());
}
}
});
以上就是一些crud的操作了,非常简单,但是还是需要一些理解
这个新手日记主要就是针对LitePal进行了总结,如何创建库,初始化库,对表内容进行增删查改,其中有很多和书中不一致,需要直接到github上面去直接学习!