Android資料庫兩種操作方式介紹: SQLite與ORMLite
本文主要介紹關係型資料庫 SQLite 和物件關係對映工具 ORMLite ,兩種方式都可以滿足Android多資料持久化儲存的需求。
1. SQLite
-
簡介:
SQLite是一款Android內建的輕量級的關係型資料庫,它的運算速度非常快,佔用資源少,通常只需要幾百K的記憶體就足夠。SQLite不僅支援標準的SQL語法,還遵循了資料庫的ACID事務(ACID,是指在可靠資料庫管理系統(DBMS)中,事務(Transaction)所應該具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)
)。 -
使用:
首先建立資料庫
我們建立MydataBaseHelper
SQLiteOpenHelper
(SQLiteOpenHelper是一個抽象類,意味著我們要使用它的話就需要建立一個類去繼承它並實現其中的方法,分別是onCreate( )和onUpgrade( )
)
MydataBaseHelper.java
public class MyDatabaseHelper extends SQLiteOpenHelper {
//用於建立Book表
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text, "
+ "catagory_id integer)";
//用於建立Category表
public static final String CREATE_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;
}
//第一次建立資料庫時會呼叫此方法
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
}
//資料庫版本升級時會呼叫此方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/*第一版的資料庫只有Book表,第二版的資料庫增加了Category表,
* 為了保證使用者體驗,在不干擾前一版的資料的情況下,實現對資料
* 庫的平滑升級,簡單的可以用此方法進行判斷在升級*/
switch (oldVersion){
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db.execSQL("alter table Book add column category_id integer");
default:
}
}
}
在MainActivity中建立MyDatabaseHelper物件並呼叫getReadableDatabase( )
或者進行資料庫的建立getWritableDatabase( )
,(兩者不同點在於,當資料庫不可寫入時(如磁碟空間已滿)getReadableDatabase( )方法返回的物件將以只讀的方式去開啟資料庫,而getWritableDatabase( )方法則將出現異常)
//資料庫檔名稱
private static final String DATABASE_NAME = "BookStore.db";
//資料庫版本號private static final int DATABASE_VERSION = 3;
private MyDatabaseHelper mMyDatabaseHelper;
mMyDatabaseHelper = new MyDatabaseHelper(this, DATABASE_NAME, null, DATABASE_VERSION);
mMyDatabaseHelper.getReadableDatabase();
- 對資料庫的增刪改查
向資料庫新增資料
SQLiteDatabase db = mMyDatabaseHelper.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
//向資料庫插入資料
db.insert("Book", null, values);
values.clear();
values.put("name", "The Lost Symbol");
values.put("author", "Dan Brown");
values.put("pages", 510);
values.put("price", 19.96);
db.insert("Book", null, values);
更新資料庫的資料
SQLiteDatabase db = mMyDatabaseHelper.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.56);
//更新資料庫的資料
db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});
刪除資料庫的資料
SQLiteDatabase db = mMyDatabaseHelper.getReadableDatabase();
//刪除資料庫的資料
db.delete("Book", "pages > ?", new String[]{"500"});
查詢資料(對資料庫的查詢操作有很多種方式,這裡只給出常見的一種)
SQLiteDatabase db = mMyDatabaseHelper.getReadableDatabase();
//對資料庫表進行查詢,會返回遊標
Cursor cursor = db.query("Book", null, null, null, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("Query BookStore.db", name);
Log.d("Query BookStore.db", author);
Log.d("Query BookStore.db", pages+"");
Log.d("Query BookStore.db", price+"");
}
cursor.close();
資料庫的事務操作
SQLiteDatabase db = mMyDatabaseHelper.getReadableDatabase();
//開啟事務
db.beginTransaction();
try {
db.delete("Book", null, null);
Toast.makeText(MainActivity.this, 刪除資料成功",Toast.LENGTH_SHORT).show();
/*if (true){
throw new NullPointerException();
}*/
ContentValues values = new ContentValues();
values.put("name", "Game of Thrones");
values.put("author", "George Martin");
values.put("pages", 720);
values.put("price", 20.15);
db.insert("Book", null, values);
//事務已經執行成功
db.setTransactionSuccessful();
Toast.makeText(MainActivity.this, "插入資料成功", Toast.LENGTH_SHORT).show();
} catch (NullPointerException e) {
e.printStackTrace();
} finally {
//結束事務
db.endTransaction();
}
- ORMLite
簡介:
ORMLite是一種物件關係對映(Object-Relational Mapping, 簡稱ORM)工具,可用於讀寫資料。ORMLite是一個框架,更佳方便對多資料進行操作,特別是對於那些對SQL語句不熟悉的人。
使用:
- 下載 ORMLite Jar
首先去ORMLite官網下載jar包,對於Android為:ormlite-android-4.48.jar
和ormlite-core-4.48.jar
; - 建立Bean
User.java
/*
* 當定義表時,第一個建議便是使用final變數定義資料庫表名和列名,
* 該方法可以簡化程式碼的維護工作,不過本例並沒用使用*/
@DatabaseTable(tableName = "tb_user") //@DatabaseTable:標明這是資料庫的一張表
public class User {
/*@DatabaseField:標明這是表中的欄位
columnName: 為該欄位在資料中的列名
generatedId:表示id為自增長*/
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName = "name")
private String name;
@DatabaseField(columnName = "desc")
private String desc;
/*ORMLite需要用到無參構造方法
* 當ORMLite需要建立User類時會使用到無引數的構造方法,
* 並通過反射機制設定成員變數,也可以使用setter方法設定成員變數*/
public User() {
}
public User(String name, String desc) {
this.name = name;
this.desc = desc;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
- 建立資料庫
原生的資料庫操作,需要繼承SQLiteOpenHelper,這裡我們需要繼承OrmLiteSqliteOpenHelper
DatabaseHelper.java
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
//資料庫檔案的名稱
private static final String TABLE_NAME = "sqlit-test.db";
/*userDao , 每張表對應一個*/
private Dao<User, Integer> userDao;
private DatabaseHelper(Context context) {
super(context, TABLE_NAME, null, 2);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase,
ConnectionSource connectionSource) {
try{
//建立表
TableUtils.createTable(connectionSource, User.class);
}catch (SQLException e){
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase,
ConnectionSource connectionSource, int i, int i1) {
try{
TableUtils.dropTable(connectionSource, User.class, true);
onCreate(sqLiteDatabase, connectionSource);
}catch (SQLException e){
e.printStackTrace();
}
}
private static DatabaseHelper instance;
/*
* 單例獲取該Helper*/
public static synchronized DatabaseHelper getHelper(Context context) {
if (instance == null){
synchronized (DatabaseHelper.class){
if (instance == null){
instance = new DatabaseHelper(context);
}
}
}
return instance;
}
/*
* 獲得userDao*/
public Dao<User, Integer> getUserDao() throws SQLException {
if (userDao == null){
userDao = getDao(User.class);
}
return userDao;
}
/*
* 釋放資源*/
public void close(){
super.close();
userDao=null;
}
}
這裡我們需要繼承OrmLiteSqliteOpenHelper,其實就是間接繼承了SQLiteOpenHelper
然後需要實現兩個方法:
onCreate(SQLiteDatabase database,ConnectionSource connectionSource)
建立表,我們直接使用ORMLite提供的TableUtils.createTable(connectionSource, User.class)
;進行建立
-
onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
-
資料庫的增刪改查
//增加資料
public void testAddUser(){
User u1 = new User("zhy", "2B青年");
DatabaseHelper helper = DatabaseHelper.getHelper(getContext());
try{
helper.getUserDao().create(u1);
u1 = new User("zhy2", "2B青年");
helper.getUserDao().create(u1);
u1 = new User("zhy3", "2B青年");
helper.getUserDao().create(u1);
u1 = new User("zhy4", "2B青年");
helper.getUserDao().create(u1);
u1 = new User("zhy5", "2B青年");
helper.getUserDao().create(u1);
u1 = new User("zhy6", "2B青年");
helper.getUserDao().create(u1);
testList();
}catch (SQLException e){
e.printStackTrace();
}
}
//刪除資料
public void testDeleteUser(){
DatabaseHelper helper = DatabaseHelper.getHelper(getContext());
try{
helper.getUserDao().deleteById(2);
}catch (SQLException e){
e.printStackTrace();
}
}
//更新資料
public void testUpdateUser(){
DatabaseHelper helper = DatabaseHelper.getHelper(getContext());
try{
User u1 = new User("zhy-android", "2B青年");
u1.setId(3);
helper.getUserDao().update(u1);
}catch (SQLException e){
e.printStackTrace();
}
}
//查詢資料
public void testList(){
DatabaseHelper helper = DatabaseHelper.getHelper(getContext());
try {
User u1 = new User("zhy-android", "2B青年");
u1.setId(2);
List<User> users = helper.getUserDao().queryForAll();
Log.e("TAG", users.toString());
}catch (SQLException e){
e.printStackTrace();
}
}
文/風騰狼(簡書作者)
原文連結:http://www.jianshu.com/p/0d8fa55d603b