直接使用SQL语句操作数据库
//插入语句
db.execSQL("insert into Book(name,author,pages,price) values(?,?,?,?)",
new String[]{"The Da Vinci Code","Dan Brown","454","16.96"});
//升级语句
db.execSQL("update book set price=? where name=?",
new String[]{"10.99","The Da Vinci Code"});
//删除语句
db.execSQL("delete from book where pages>?",new String[]{"500"});
//查询语句
db.rawQuery("select * from book",null);
使用LitePal操作数据库
一款开源的Android数据库框架,采用对象关系映射(ORM)模式,对数据库的功能进行了封装
LitePal又是在于它采用了对象关系映射的模式,这里的对象就是Java概念中的面向对象编程,关系自然指的就是数据库中的关系型数据库概念,所以ORM就是指将面向对象语言和面向关系数据库之间建立一种映射关系
这种模式的强大之处在于我们可以利用面向对象的思维来操作数据库,不需要再使用SQL语句
LitePal创建/升级数据库
以创建数据库为例,可以通过创建相关的类,然后建立类与数据库的映射关系,实现数据库的创建
package cn.ywrby.litepaltext;
public class Book {
private int id;
private String author;
private double price;
private int pages;
private String name;
public int getId() {
return id;
}
public String getAuthor() {
return author;
}
public double getPrice() {
return price;
}
public int getPages() {
return pages;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(double price) {
this.price = price;
}
public void setPages(int pages) {
this.pages = pages;
}
public void setName(String name) {
this.name = name;
}
}
在litepal.xml中声明要配置的映射模型类(使用完整的类名)可以有多个映射,都放在list下即可
<?xml version ="1.0" encoding ="utf-8"?>
<litepal>
<dbname value="BookStore"></dbname> <!--指定数据库名-->
<version value="1"></version> <!--指定版本号-->
<!--用于指定所有的映射模型-->
<list>
<mapping class="cn.ywrby.litepaltext.Book"></mapping>
</list>
</litepal>
主程序中调用
package cn.ywrby.litepaltext;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import org.litepal.LitePal;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_create=findViewById(R.id.bt_create);
bt_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//getDatabase是一次最简单的数据库操作,任意数据库操作都会自动创建我们需要的数据库
LitePal.getDatabase();
}
});
}
}
LitePal在更新方面相较于之前的SQLiteOpenHelper类也更加简单,我们在升级时不需要再drop掉以前的表或是加入严格的逻辑控制以保留相关表与数据,需要修改的表格直接在定义的类中修改即可,并且想要加入新建的表格只需要创建对应的类,然后在list下添加映射关系,最后将版本号+1即可
使用LitePal添加数据
进行表管理(创建更新)时不需要模型类有任何继承结构,但当我们需要进行CRUD操作时,就必须继承LitePalSupport类
该类中包含实例方法save()用于完成对数据的添加。
Button bt_add=findViewById(R.id.bt_add);
bt_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book("Dan Brown",18.96,454,"The Da VinCi Code");
book.save();
Toast.makeText(MainActivity.this,"save succeeded!",Toast.LENGTH_SHORT).show();
}
});
使用LitePal更新数据
方法一:用已存储的对象来更新
Button bt_update=findViewById(R.id.bt_update);
bt_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book("Dan Brown",18.96,454,"The Da VinCi Code");
book.save();
book.setPages(559); //修改数据
book.save();
Toast.makeText(MainActivity.this,"save succeeded!",Toast.LENGTH_SHORT).show();
}
});
方法二:调用updateAll()方法
Button bt_update=findViewById(R.id.bt_update);
bt_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book();
book.setPages(555);
book.setPrice(11.11);
book.updateAll("name=? and author =?","The Da VinCi Code","Dan Brown");
Toast.makeText(MainActivity.this,"save succeeded!",Toast.LENGTH_SHORT).show();
}
});
更新为默认值时
book.setToDefault("pages");
使用LitePal删除数据
方式一,已存储的对象直接调用delete方法即可
方式二
final Button bt_delete=findViewById(R.id.bt_delete);
bt_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LitePal.deleteAll(Book.class,"price>?","15");
}
});
使用LitePal查询数据
//查询数据
Button bt_delete=findViewById(R.id.bt_delete);
bt_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LitePal.deleteAll(Book.class,"price>?","15");
}
});
Button bt_query=findViewById(R.id.bt_query);
bt_query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Book> books=LitePal.findAll(Book.class);
for(Book book:books){
Log.d("MainActivity", "book name is "+book.getName());
}
}
});
此外,除了findAll之外,LitePal提供了非常丰富的API。findFirst,findLast,select对标SQL中的select,where对标SQL中的where,order对标SQL中的order By,limit用于限制查询结果的数量,offset用于指定查询结果的偏移量。
上述方法都支持链式编程
如果仍有需要,LitePal依然支持原生SQL查询,通过findBySQL()即可