fmdb是乙個封裝很好的sqllite類庫。專案中呼叫的時候只需要寫sql語句,就能實現資料的curd。我試過即使手寫sql語句也很麻煩,需要乙個字段乙個欄位的拼上去,而且容易出錯。有沒有動態獲取欄位的一種做法呢。當然是有的。在.net中就有獲取乙個類的每個欄位名稱和型別之類的方法。同理,我想oc中肯定也會存在,於是乎,強大的runtime機制就可以拿來用用了。
為什麼用動態的呢,因為動態的拼接表面上就和orm差不多了,開發者基本不用接觸sql語句,就能實現與資料庫的資料互動。下面看具體介紹:
class c =[somemodel class];然後遍歷properties,獲取到每個欄位的欄位名稱和字段型別unsigned
intoutcount,i;
//class_copypropertylist方法獲取 somemodel中的字段集合
objc_property_t *properties = class_copypropertylist(c, &outcount);
objc_property_t property =properties[i];這樣,類中的每個欄位都有了,型別也有了,那麼拼接update語句或者insert語句再或者查詢都可以。例如: update table set a='a',b='b',c=1 where 1=1propertyname = [nsstring stringwithcstring:property_getname(property) encoding:nsutf8stringencoding];
propertytype = [nsstring stringwithcstring:property_getattributes(property) encoding:nsutf8stringencoding];
欄位a,b,c已經能動態取出,a,b,1可以根據新的model 用 [model objectforkey:]方法獲取值。先簡單說這麼多,下面我通過乙個小demo來演示一下。
首先實現方法,分析類的字段屬性和型別,並存放到乙個nsdictionary中。
- (nsdictionary *)pz_getclasspropertywithclass:(class)c然後隨便寫個model,呼叫方法如下:[propertynames addobject:propertyname];
//獲取屬性型別
propertytype =[nsstring stringwithcstring:property_getattributes(property) encoding:nsutf8stringencoding];
if ([propertytype hasprefix:@"t@"
]) else
if ([propertytype hasprefix:@"
ti"]||[propertytype hasprefix:@"
ti"]||[propertytype hasprefix:@"
ts"]||[propertytype hasprefix:@"
ts"]||[propertytype hasprefix:@"tb"
])
else
}free(properties);
return
[nsdictionary dictionarywithobjectsandkeys:propertynames,propertynamekey,propertytypes,propertytypekey, nil];
}
nsdictionary *dict = [[pzfmdbutil sharedutil] pz_getclasspropertywithclass:[pzdbmodel class列印結果為:]];
nslog(
@"%@
",dict);
欄位名稱和型別都有啦,那麼拼接 insert into table (name,age,number,address) values (?,?,?,?) 是不是很easy了呢。然後在呼叫一下fmdb的方法,就輕鬆實現model直接儲存或者更新到sqllite中了。
例如以下**:
pzdbmodel *model =[[pzdbmodel alloc] init];我們在看一下資料庫:model.name = @"
panzi";
model.number = 12
; [[pzfmdbutil sharedutil] pz_adddatawithmodel:model];
我想,更新查詢神馬的就不用介紹了吧。當然呢,想在封裝一層也是很麻煩的,要考慮好多東西。有時候想想還不如直接寫sql來的爽快~~
github:
matlab如何寫乙個類
類是一種資料型別,與普通的資料型別不同的是類不僅包含資料,還包含對資料的操作,類把資料和資料操作方法封裝在一起,作為乙個整體參與程式的執行。類具有可繼承性,建立乙個新的類的時候,可以在乙個基類中新增成員派生出新類。類的變數和類的例項是不同的,類的例項是動態分配的記憶體區域,通常稱類的例項維 物件 同...
如何寫乙個Stack?
1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...
譯 不用 Class,如何寫乙個類
譯文出自 掘金翻譯計畫 譯者 emilyqirabbit 校對者 allenlongbaobao,sunhaokk python 的物件模型令人難以置信的強大 實際上,你可以重寫所有 物件 或者向任何人分發奇怪的物件,並讓他們像對待正常的物件的那樣接受它。python 的物件導向是 smalltal...