前言:因為專案很老,還是用的原生sqlite,因為建表還是手動構建sql,cursor轉bean或者list都不靈活,特此用反射和註解做了優化處理
首先建立我們的標註,有tablename,primary,notnull,defaulttext,defaultint,defaultdecimal,autoincrement
@target(elementtype.type)
@retention(retentionpolicy.runtime)
public @inte***ce
tablename
@target(elementtype.field)
@retention(retentionpolicy.runtime)
@documented
public @inte***ce
primary
@target(elementtype.field)
@retention(retentionpolicy.runtime)
public @inte***ce
notnull
@target(elementtype.field)
@retention(retentionpolicy.runtime)
public @inte***ce
defaulttext
@target(elementtype.field)
@retention(retentionpolicy.runtime)
public @inte***ce
defaultint
@target(elementtype.field)
@retention(retentionpolicy.runtime)
public @inte***ce
defaultdecimal
然後建立我們的book類@target(elementtype.field)
@retention(retentionpolicy.runtime)
public @inte***ce
autoincrement
最後建立dbutil類@tablename(tablename = "book")
public
class
book
public
void
setname(string name)
public
intgetid()
public
void
setid(int id)
public
intgetpages()
public
void
setpages(int pages)
public
double
getprice()
public
void
setprice(double price)
public string getmem()
public
void
setmem(string mem)
public
long
getdate()
public
void
setdate(long date)
}
public
class
dbutil
/*** 根據類結構構造表。
*/public
static string gettablebuildingsql(class<?> clazz) else
// getdeclaredfields():獲取該類檔案中宣告的字段
// getfields():獲取該類public宣告字段
field arrfield = clazz.getdeclaredfields();
for (int i = arrfield.length - 1; i >= 0; i--) else
if (f.isannotationpresent(defaulttext.class))
if (f.isannotationpresent(defaultint.class))
if (f.isannotationpresent(defaultdecimal.class))
if (f.isannotationpresent(autoincrement.class))
if(f.isannotationpresent(notnull.class))
if (i > 0) }}
return strbuilder.tostring();
}/**
* 構造插入contvalues
**@param bean
*@return
*/public
static contentvalues translate2contentvalues(object bean)
//排除自動增長的字段
if (f.isannotationpresent(autoincrement.class))
string name = f.getname();
object value = f.get(bean);
if (value instanceof byte) else
if (value instanceof short) else
if (value instanceof integer) else
if (value instanceof long) else
if (value instanceof string) else
if (value instanceof
byte) else
if (value instanceof boolean) else
if (value instanceof float) else
if (value instanceof double)
}} catch (exception e)
return cv;
}/**
* 從cursor中提取bean
**@param cursor
*@param cls
*@param
*@return
*/public
static
t cursortobean(cursor cursor, classcls) );
setmethod.invoke(bean, getvaluebyfield(cursor, column, field));}}
}} catch (exception e) finally
}return bean;
}/**
* 從cursor中提取bean 列表
**@param cursor
*@param cls
*@param
*@return
*/public
static
listcursortobeans(cursor cursor, classcls) );
setmethod.invoke(bean, getvaluebyfield(cursor, column, field));}}
beans.add(bean);
}} catch (exception e) finally
}return beans;
}/**
* 根據字段取出值
**@param cursor
*@param columnname
*@param field
*@return
*/private
static object getvaluebyfield(cursor cursor, string columnname, field field)
private
static field findfieldbyname(field fields, string name)
}return
null;
}}
利用註解獲取greendao的表名
greendao entity註解類原始碼中 retention retentionpolicy.source 表示編譯時有效,執行時是沒有效果的所以無法使用greendao的註解來進行對映獲取表名等屬性 首先自己新建註解類後重新註解 retention retentionpolicy.runtim...
C 利用 SQL檔案自動建庫建表等的類
自動建庫建表 public class operationsqlfile 開始執行 public void start 執行sql語句 連線字串 資料庫名 sql語句 private void executesql string connstring,string databasename,stri...
反射中獲取類的註解名
1.首先定義乙個類 public class cartcode 標籤code displayname 標籤code public virtual string code 序列號 displayname 序列號 public virtual string serialnumber 2.下面通過反射獲取...