做安卓開發無可避免的用到數據庫,直接自己封裝也是可以的,這個下一篇再寫,現在先來看看xutils的dbutils的使用方式:
1.下載xutls(網址:https://github.com/wyouflf/xUtils)
2.項目中直接引用或者只是把jar包拷貝進項目的libs文件夾
3.自己封裝下,把需要用到的接口封裝出來(DatabaseUtils.java)
4.這裏給出創建db跟數據庫升級的代碼,如下:
public static DatabaseUtils getInstance(Context context) {//單例
if (dbUtils == null) {
dbUtils = new DatabaseUtils(context);
}
return dbUtils;
}
//創建數據庫以及升級相關代碼
public DatabaseUtils(Context context) {
mContext = context;
db = DbUtils.create(mContext, "data.db", curVersion, new DbUpgradeListener() {//curVersion:數據庫版本,升級就是根據對比該字段決定要不要執行DbUpgradeListener
@Override
public void onUpgrade(DbUtils arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
try {
if (arg1 == 1 && arg2 == 2) {//判斷數據庫版本從1到2,滿足的話執行下面語句
String sql = "ALTER TABLE " + TableUtils.getTableName(SOSNumber.class)
+ " ADD COLUMN TEMP TEXT";
arg0.execNonQuery(sql);
}
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
5.創建實體類(也就是定義一下即將要存儲在數據庫中的表結構),這裏給出簡單的例子:一個Company表
// 建議加上註解, 混淆後表名不受影響
@Table(name = "Company")
public class Company implements Serializable {
<span style="white-space:pre"> </span>@Id // 如果主鍵沒有命名名爲id或_id的時,需要爲主鍵添加此註解
@NotNull
//@NoAutoIncrement // int,long類型的id默認自增,不想使用自增時取消註釋
private int id;
@Column(column = "name")
@NotNull
private String name;
@Column(column = "phone")
@NotNull
private String phone;
public Company() {
//此處很重要,增加了下面的帶參構造函數,一定要寫無參構造函數,否則該表會創建失敗
}
public Company(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Company{"name='" + getName() + '\'' + ", phone='" + getPhone()+'}';
}
}
6.創建表
DatabaseUtils db = new DatabaseUtils(context);
int id = 1;
String name = "XX有限公司";
String number = "0755-1234567";
Company company = new Company(id, name, number);
//也可以使用下面這種方式
/*
Company company = new Company();
company.setId(id);//貌似在上面類裏面少寫了這個接口,大家將就下自己加上吧
company.setName(name);
company.setPhone(number);
*/
//saveOrupdate的定義:public <T> void saveOrupdate(Class<T> entityType, Object id, Object entity, List<?> entities)
db.saveOrupdate(Company.class,id,company,null);
7.很多時候需要使用外鍵關聯表,這時候的表結構需要重新定義,字表代碼如下(父表請參考上面):
// 建議加上註解, 混淆後表名不受影響
@Table(name = "CompanyInfo")
public class CompanyInfo extends EntityBase implements Serializable{
//只是舉例,所以剩下字段還請自行添加
@Foreign(column = "company_id", foreign = "id")//前面id爲存在本表裏面外鍵的字段名(company_id),後面id爲對應父表主鍵字段名
public Company parent;
@Column(column = "id")
@NotNull
private int Id;
@Column(column = "company_id")
@NotNull
private int companyId;
public CompanyInfo(){
}
public InsureCompanyInfo(Company parent, int parentid,int id) {
this.parent = parent;
this.companyId = parentid;
this.Id = id;
}
//下面請自行添加一些get,set函數
@Override
public String toString() {
return "CompanyInfo{" +
"id=" + id + +
'}';
}
}
int id = 2;
String name = "XX公司";
String phone = "0755-1234567";
Company cc = new InsureCompany(id,name,phone);
ArrayList<CompanyInfo> fieldList = new ArrayList<CompanyInfo>();
for (int i = 0;i<5;i++) {//這裏示例性的寫五條數據,暫時id用i來寫了
CompanyInfo ef = new CompanyInfo(cc, id, i);
fieldList.add(ef);
}
db.saveOrupdate(Company.class, cc.getId(), cc, fieldList);
9.數據查找跟刪除,代碼如下:
int id = 1;
Company cc = db.findFirst(Selector.from(Company.class).where("id", "=", id));//查找第一個id=1的
Company cc1 = db.findById(Company.class,id);//如果id爲主鍵不允許重複,那麼這句跟上面那句作用一樣
//此外還有:db.findAll(Selector);等接口,查找所有滿足條件的數據;保存直接使用db.save()或者db.saveAll(),使用方式都是一樣的,就不多寫了
db.delete(CompanyInfo.class, WhereBuilder.b("company_id", "=", cc.getId()));//刪除CompanyInfo表中父表id = 1的
//db.deleteById(),db.deleteAll()等刪除接口,同上使用方式
差點忘記了,saveOrupdate接口是自己封裝的,也放上來吧
public <T> void saveOrupdate(Class<T> entityType, Object id, Object entity, List<?> entities) {
T tmp = findById(entityType, id);
if (tmp == null) {
if (entities != null && entities.size() != 0) {
saveBindingAll(entities);
} else {
save(entity);
}
} else {
update(entity);
if(entities != null){
updateAll(entities);
}
}
}