Squidb使用總結

2021-08-09 10:30:58 字數 3870 閱讀 7083

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執行。一般來...