squidb是乙個第三方資料庫操作庫,優點在於建表和資料庫公升級時較為方便。其中model在寫時不是執行緒安全,在讀時是執行緒安全。不是orm。
參照github上方法
每個表需繼承tablemodel,通過注釋方法可自動生成。如建立乙個表名為「people」,繼承tablemodel的子類名為」person」的表:
@tablemodelspec(classname=」person」,tablename=」people」)
public class personspec
新建的表中會自動生成乙個主鍵名為」_id」;@columnspec中方法使欄位」firstname」改名為「fname」,預設值設為「」。
可定義的字段型別為:基本型別及其封裝、string、byte
建好後的表中字段會自動生成get、set方法。
若想自定義主鍵可如下寫,但主鍵不可自增:
@tablemodelspec(classname=」person」,tablename=」people」)
public class personspec
注意:表中的字段不可以為其它model的集合,但可在表的類中新增額外的方法:
@tablemodelspec(classname=」person」,tablename=」people」)
public class personspec
}
建立乙個squiddatabase的子集,並需要實現如下方法(建議使用單例模式):
string getname(); 資料庫的名字
int getversion(); 當前資料庫版本
table gettables(); 當資料庫初始化時,返回需要被建立的表
void onupgrade(sqlitedatabase db,int oldversion,int newversion); 處理資料庫公升級(詳見資料庫公升級)
使用database的persist()方法:
person new person=new person();
newperson.setfirstname(「sam」);
newperson.setlastname(「bosley」);
newperson.setage(26);
database.persist(newperson);
long rowed=newperson.getid(); 在呼叫persist()後,model會自動獲得id,即_id欄位
也可以使用persistwithonconflict()方法自己定義衝突演算法。
注意:如果model的id未設定,呼叫persist()方法會增加乙個新行,但如果設定後已存在會進行替換。如果想要建立一行新資料,不管是否設定id,可以呼叫createnew(model),將會清除id,並插入一行新資料。
可使用query()方法和fetch()方法
query() 返回所有結果:
query votersquery=query.select(person.properties).where(person.age.gte(18));
squidcursorvoters=database.query(person.class,votersquery);
tryfinally
}
fetch() 返回指定條件結果:
long rowed=1;
person person=database.fetch(person.class,rowid);
fetchbycriterion() 返回第乙個符合條件的物件:
string guid=」xyz1」;
user user=database.fetchbycriterion(user.class,user.guid.eq(guid));
fetchbyquery() 返回第乙個query的結果:
query query=query.select().orderby(person.last_name.asc());
person person=database.fetchbyquery(person.class,query);
使用fetch() 可以只得到所需要的字段資料:
long id=1;
person person=database.fetch(person.class,id,person.first_name,person.last_name);
string fullname=person.getfirstname()+」 」+person.getlastname();
//int age=person.getage();呼叫此方法會報錯,因為並未讀取此欄位
針對一條資料修改(model必須已有id):
public void incrementpersonage(person person)
一次修改多條符合條件的資料:
person template=new person();
template.setfirstname(「samuel」);
database.update(person.first_name.eq(「sam」),template);
根據id進行刪除:
long rowid=1;
database.delete(person.class,rowid);
根據條件刪除多條資料:
database.deletewhere(person.class,person.first_name.eq(「sam」));
可使用的方法有(成功返回true,失敗返回false):
繼承squiddatabase,重寫getversion()和onupgrade()方法
版本1:
public class mydatabase extends squiddatabase
@override
protected boolean onupgrade(sqlitedatabase db,int oldversion,int newversion)
}
版本2:
public class mydatabase extends squiddatabase
@override
protected boolean onupgrade(sqlitedatabase db,int oldversion,int newversion)
return true;
}}
版本3:
public class mydatabase extends squiddatabase
@override
protected boolean onupgrade(sqlitedatabase db,int oldversion,int newversion)
return true;
}}
onupgrade()方法返回是否公升級成功,若不確定,可返回try…方法的返回值。
若公升級失敗,會呼叫onerror()、onmigrationfailed()方法。onerror()方法僅僅是列印log,處理方法可在onmigrationfailed()中執行,比如呼叫recreate()方法刪除資料庫並開啟乙個新的。recreate()方法只在onupgrade()和onmigrationfailed()中線程安全,若在其它地方多執行緒呼叫會導致崩潰。
EJunGrid使用總結
1 1。0版沒有實現垂直方向上的對齊,procedure tobgui reportdesign.griddrawcelltext acanvas tcanvas const arect trect const acoord tpoint agrid tzjgrid const text strin...
SDRAM使用總結
1,sdram的位址線,在我們一般用的什麼sram啊,psram啊,ram啊,一般而言都是有多少根位址線,然後可以算出定址空間,比如有11根位址線,那定址空間就是2的11次方減1。但是sdram是分列位址和行位址的,行 列位址線是復用的,所以有時候我們看到說定址空間有多大多大,但是看看位址線怎麼就那...
assert使用總結
assert expression1 assert expression1 expression2 如果expression1為true,則不丟擲錯誤,程式正常執行,expression2也不會執行。如果expression1為false,則丟擲異常,程式中斷跳出,expression2執行。一般來...