xutils中dbutils的基礎使用詳解

做安卓開發無可避免的用到數據庫,直接自己封裝也是可以的,這個下一篇再寫,現在先來看看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 + +
				'}';
	}
}


8.帶外鍵的數據保存,代碼如下:

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);
			}			
		}
	}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章