任何一个app,都和数据脱离不了关系,我们使用app时也是一直在和数据打交道,我们看的新闻是数据,我们听的音乐是数据,我们用微信聊天也是在用数据,这篇文章我们来对比一下Android中两种不同的操作数据库的方法,一是直接通过sqlite操作,第二种是通过Litepal进行ORM操作数据库。
创建数据库
Sqlite版
Android中提供了一个SqLiteOpenHelper的类来帮我们实现数据库的操作,我们使用SqLiteHelper的一个非常重要的实例方法:getWritaleDataBase().
首先我们要创建一个class继承自SQLiteOpenHelper,代码如下:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";//SQL命令存入到String常量中
public static final String CREAT_CATEGORY = "create table Category(" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";//同上
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}//MyDataBaseHelper的构造函数
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);//执行SQL语句
db.execSQL(CREAT_CATEGORY);
Toast.makeText(mContext,"Create succeed",Toast.LENGTH_LONG).show();//执行完之后弹出通知
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
然后在xml中创建一个Button(代码略)
最后修改MainActivity的代码:
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
final Button createDatabase = (Button)findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
LitePal版:
LitePal是一款开源的数据库框架,GitHub地址:https://github.com/LitePalFramework/LitePal ,上面有详细的关于其的说明。
使用Litepal首先要在grandle中加入:
dependencies {
implementation 'org.litepal.android:core:2.0.0'//最新版本为2。0.0
}
然后要在app/source/main文件夹下新建一个文件夹:assets来存放LitePal的xml文件,新建litepal.xml:
dbaname用于指定数据库名,vesion为版本号,list用于指定所有的映射模型
最后还需要在AndroidManifes.xml文件中注册一下:
<application
android:name="org.litepal.LitePalApplication"
</application>
配置完之后就可以开始创建数据库了,由于使用ORM模型,所以我们可以采用class的方式描述SQL语言,新建一个Book类:
import org.litepal.crud.DataSupport;
import org.litepal.crud.LitePalSupport;
public class Book extends LitePalSupport{
private int id;
private double price;
private String author;
private int pages;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
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;
}
语句很简单,我们定义了id,author,price,pages,name这几个字段,并且生成了对应的getter和setter方法,这个Book类就对应于数据库中的Book表。
接下来需要在litepal.xml文件中添加一下Book类:
<list>
<mapping class="com.example.a15186.litepaltest.Book" />
</list>
最后修改MainActivity代码即可:
Button createDatabase = (Button)findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LitePal.getDatabase();
}
});
可以看到Book表已经创建成功了。
升级数据库
Sqlite版
升级数据库我们需要用到OnUpgrade方法,我们的目标是添加一个名为category的table,我们同样把指令赋值给一个常量
public static final String CREAT_CATEGORY = "create table Category(" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
然后在Oncreate中添加执行语句:
db.execSQL(CREAT_CATEGORY);
还没有完,这样是创建不了的,还需要改动一下OnUpgrade的数据:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
这句语句的意思就是如果Book/Category表存在的话删除他重新创建。
最后还需要修改一下MainActivity来使Upgrade生效:
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
MyDatabaseHelper的最后一个参数为版本号,原来是1,现在只要改成一个比1大的数就可以了。
执行命令:
可以看到Category表已经创建了。
Litepal版
而在Litepal中升级数据库则简单得多,比如我们同样要添加一个Category表,只需要像创建Book表一样创建一个Category class:
public class Category {
private int id;
private String categoryName;
private int categoryCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getCategotyCode() {
return categoryCode;
}
public void setCategotyCode(int categotyCode) {
this.categoryCode = categotyCode;
}
}
然后同样在litepal.xml中添加一下:
<mapping class="com.example.a15186.litepaltest.Category" />
重新运行一下程序:
可以看到Category表已经创建好了,相比较之下litepal则要简单得多。
添加数据
Sqlite
首先在activity_main.xml中添加一个按钮:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/add_data"
android:text="Add Data"
/>
修改MainActivity中的代码:
Button addData = (Button)findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();//实例化一个contentvalues来操作数据
values.put("name","The Da Vinci Code");//添加name
values.put("author","Dan Brown");
values.put("pages",154);
values.put("price",16.96);
db.insert("Book",null,values);//把values添加到Book表中
values.clear();/清楚values存放大数据
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",19.95);
db.insert("Book",null,values);//插入再次添加到values中的数据
}
执行操作:
数据已经被插入
Litepal
使用litepal添加数据首先需要使Book class继承自LitepalSupport:
public class Book extends LitePalSupport{
然后修改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.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unkown");
book.save();
}
代码非常简单。
更新数据
Sqlite
首先同样加入一个对应的Button,然后修改MainActivity:
Button updateData = (Button)findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",10.99);
db.update("Book",values,"name = ?", new String[]{"The Da Vinci Code"});
}
});
db的update有四个参数,第三个参数对应于SQL语句中的where部分,最后一个参数代表第三个参数的问号,总的意思是把Book表中名为"The Da Vinci Code"的书价格改成10.99。
Litepal
首先同样加入一个对应的Button,然后修改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");
}
});
实例化一个Book类,然后set数据,最后使用UpdateAll方法把名为 The Lost Symbol"作者为“Dan Brown"的书price和press更改了
删除数据
Sqlite
Button deleteData = (Button)findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages>?",new String []{"500"});
}
});
代码代表把Book表中pages大于500的书全部删除
Litepal
Button deleteData = (Button)findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LitePal.deleteAll(Book.class,"price < ?","15");
}
});
代码代表把Book表中价格小于15的书删除