Android數據庫框架-Archiver(LiteOrm)的簡單使用(一)


Android系統為開發者提供了SQLiteOpenHelper幫助類來操作數據庫,當然了,系統也封裝得比較好了,不過今日我們來看看其他的數據庫框架。

開源地址:https://github.com/litesuits/android-lite-orm  在此要先感謝作者,作者的個人主頁:http://litesuits.com

小編只提供自己的使用,當然,也是從作者提供的demo中分化而來的,目前小編的所使用的數據庫還沒有很繁瑣,就簡單的單表增刪改查等等

開始:

不鬧了,先上幾張圖片看看效果好了(只提供了部分效果):





package com.napoleonbai.android.model;

import java.io.Serializable;

import com.litesuits.orm.db.annotation.Check;
import com.litesuits.orm.db.annotation.Column;
import com.litesuits.orm.db.annotation.Ignore;
import com.litesuits.orm.db.annotation.PrimaryKey;
import com.litesuits.orm.db.annotation.PrimaryKey.AssignType;

/**
* 所有Model的頂層父類
*
* @author NapoleonBai
*
*/
public class BaseModel implements Serializable {

private static final long serialVersionUID = 1L;

// 設置為主鍵,自增
@PrimaryKey(AssignType.AUTO_INCREMENT)
// 取名為“_id”,如果此處不重新命名,就采用屬性名稱
@Column("_id")
public int id;

// @Check條件檢測
@Check("description NOT NULL")
public String description = "字段描述";

@Ignore
private String ignore = "標記Ignore,並不會出現在數據庫中";

@Override
public String toString() {
return "BaseModel{" + "description='" + description + '\'' + '}';
}
}
這是建立的一個頂層的Model父類,這里處理所有Model類都共有的字段,比如數據庫的“_id”字段這些等等

然后我們還需要一個Model類,暫時我們用Users來替代

package com.napoleonbai.android.model;

import com.litesuits.orm.db.annotation.Check;
import com.litesuits.orm.db.annotation.Default;
import com.litesuits.orm.db.annotation.NotNull;
import com.litesuits.orm.db.annotation.Table;
import com.litesuits.orm.db.annotation.Unique;

/**
* 用戶信息類
*
* @author NapoleonBai
*
*/
// 創建一個名為user_table的表格
@Table("user_table")
public class Users extends BaseModel {
private static final long serialVersionUID = 1L;
// 非空約束 形同於@Check("userName NOT NULL")
@NotNull
private String userName;

// 性別用 0 - 1 - 2替代,0=男,1=女,2=未知
@Check("userSex >= 0 AND userSex < 3")
// 設置默認值
@Default("2")
private int userSex;

// 唯一鍵約束
@Unique
@NotNull
private String userPhone;

private String userEmail;

/**
* 構造方法,傳入數據
*
* @param name
* @param sex
* @param phone
* @param email
*/
public Users(String name, int sex, String phone, String email) {
this.userName = name;
this.userSex = sex;
this.userEmail = email;
this.userPhone = phone;
}

public Users() {
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public int getUserSex() {
return userSex;
}

public void setUserSex(int userSex) {
this.userSex = userSex;
}

public String getUserPhone() {
return userPhone;
}

public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}

public String getUserEmail() {
return userEmail;
}

public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}

public void setUserID(int id) {
super.id = id;
}
}
什么get、set方法都不用多說了吧,這里提供了兩個構造方法,一個有參一個無參,有參的就綁定數據了,無參的就創建對象的引用,先不綁定數據,各有用處吧。

@Table是指點表名,后面的@Check這些都類似,都是Archiver(LiteOrm)框架提供的,如需深入了解,請查看源碼就好。

然后就看操作類了

package com.napoleonbai.android.archiver;

import java.util.ArrayList;

import com.litesuits.android.log.Log;
import com.litesuits.orm.LiteOrm;
import com.litesuits.orm.db.DataBase;
import com.litesuits.orm.db.assit.QueryBuilder;
import com.litesuits.orm.db.model.ColumnsValue;
import com.litesuits.orm.db.model.ConflictAlgorithm;
import com.napoleonbai.android.model.Users;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
/** 數據庫引用對象 */
private DataBase mainDB;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

/**
* 按鈕事件的監聽
*
* @param v
*/
public void onClick(View v) {
managerDB(v.getId());
}

/**
* 執行數據庫操作
*
* @param v
*/
private void managerDB(final int id) {
new Thread(new Runnable() {
@Override
public void run() {
switch (id) {
case R.id.button1:
// 創建數據庫
if (mainDB == null) {
// 創建數據庫,傳入當前上下文對象和數據庫名稱
mainDB = LiteOrm.newInstance(MainActivity.this,
"napoleonbai.db");
}
break;
case R.id.button2:
// 新增數據
Users mUser = new Users("NapoleonBai"
+ Thread.currentThread().getId(), 1, "1688888"
+ Thread.currentThread().getId(),
"napoleonbaiandroid@gmail.com");

mainDB.save(mUser);
break;
case R.id.button3:
// 刪除指定數據
// 刪除第2到第5條 ,換句話說就是刪除第二、三、四、五條數據
// 最后一個參數可為null,默認按ID升序排列
<span style="white-space:pre"></span> mainDB.delete(Users.class, 2, 5, "_id");
break;
case R.id.button4:
// 修改數據

// 查詢得到全部數據
ArrayList<Users> userDatas = mainDB.queryAll(Users.class);
// 設置第一個數據的Name
userDatas.get(0).setUserName("小白楊");
// 修改數據
mainDB.update(userDatas.get(0));
break;
case R.id.button5:
// 查詢一條數據
//指定查詢ID和查詢對象
Users u2=mainDB.queryById(11,Users.class);
Log.i("data",u2.getUserName());
break;
case R.id.button6:
// 查詢全部數據
ArrayList<Users> datas = mainDB.queryAll(Users.class);
//得到數據庫中有多少條數據
Log.i("data", datas.size());
break;
default:
break;
}
}
}).start();

}
}
這里的界面布局是六個按鈕組成的,onClick是布局中設置的點擊事件監聽方法,采用子線程的方式來更新數據庫,當然了,這里就沒有對線程進行優化,這不是重點。

重點是:代碼中沒有給全操作方法,當然了,一眼就能看出來,是不是呢?嘻嘻

那么就請看補充:

1.在刪除數據的時候,我們只是說明了刪除從某到某的數據

那么,我們如果要刪除指定字段的數據呢?要刪除全部數據呢?

// 刪除某個對象(類似於刪除某條數據,比如按照ID刪除)
Users user = new Users();
user.setUserID(1);
mainDB.delete(user);
// 當然,刪除全部數據,就只需要使用
mainDB.deleteAll(Users.class);
這樣就好了,沒錯!

2.修改數據,上面小編也只是說了從數據庫中查詢出來,然后根據查詢回來的數據進行修改,當然了,也可以得到判斷ID,進行指定的數據修改,不過上面的方式

這樣做的話, 顯得太力不從心了。所以,那么有沒有直接點的方法呢?能不能更新指定數據的指定字段,指定數據的全部數據呢?

結果是:

//修改指定ID的指定字段數據
Users u1 = new Users();
u1.setUserID(10);
//更改userName字段的數據
ColumnsValue cv = new ColumnsValue(new String[] { "userName" },
new Object[] { "大白楊" });
//僅能在已經存在時更新:ConflictAlgorithm.Replace
mainDB.update(u1, cv,ConflictAlgorithm.Replace);

//更新指定ID所有數據
u1.setUserPhone("188888888");
u1.setUserName("小白楊");
mainDB.update(u1, ConflictAlgorithm.Fail);

//當然了,save也可以用來修改數據,類似於更改指定ID的所有數據

沒錯,你看到的結果就是小編所說的那樣。嘻嘻

3.查詢所有數據,上面也提到了獲取所有數據,當然也可以判斷數據庫中到底有多少條數據。

但是很多時候我們只需要判斷有多少條數據,並不用取出所有數據,那么有沒有方法完成呢?

而且,我們能不能進行模糊查詢,按條件查詢呢?

恭喜,這些都有!

//如果這樣去獲取數據庫中有多少條數據,是不是有點蠢呢?嘻嘻
//有提供這樣的方法:
long count = mainDB.queryCount(Users.class);

Log.i("data", count);

//那么,如果想要按照條件查詢呢?
//請看如下:
QueryBuilder qb = new QueryBuilder(Users.class)
.columns(new String[] { "_id" })
.appendOrderAscBy("_id")
.appendOrderDescBy("userPhone")
.distinct(true)
.where("userName" + " like ?",
new String[] { "%楊" });

count = mainDB.queryCount(qb);
Log.i("data", "查詢出UserName中帶\"楊\"字的共有"+count+"條");

到這里,單表操作也就算完成得差不多了,最后,在退出、或者不使用數據庫的時候,關閉數據庫釋放內存就好了

<span style="white-space:pre"></span>mainDB.close();

我們下期再見,謝謝

哦,提供jar下載:http://download.csdn.net/detail/napoleonbai/8265407(使用的框架jar包)



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com