如何寫乙個FMDB幫助類?看看runtime吧

2022-03-10 13:44:24 字數 2530 閱讀 6244

fmdb是乙個封裝很好的sqllite類庫。專案中呼叫的時候只需要寫sql語句,就能實現資料的curd。我試過即使手寫sql語句也很麻煩,需要乙個字段乙個欄位的拼上去,而且容易出錯。有沒有動態獲取欄位的一種做法呢。當然是有的。在.net中就有獲取乙個類的每個欄位名稱和型別之類的方法。同理,我想oc中肯定也會存在,於是乎,強大的runtime機制就可以拿來用用了。

為什麼用動態的呢,因為動態的拼接表面上就和orm差不多了,開發者基本不用接觸sql語句,就能實現與資料庫的資料互動。下面看具體介紹:

class c =[somemodel class];

unsigned

intoutcount,i;

//class_copypropertylist方法獲取 somemodel中的字段集合

objc_property_t *properties = class_copypropertylist(c, &outcount);

然後遍歷properties,獲取到每個欄位的欄位名稱和字段型別

objc_property_t property =properties[i];

propertyname = [nsstring stringwithcstring:property_getname(property) encoding:nsutf8stringencoding];

propertytype = [nsstring stringwithcstring:property_getattributes(property) encoding:nsutf8stringencoding];

這樣,類中的每個欄位都有了,型別也有了,那麼拼接update語句或者insert語句再或者查詢都可以。例如: update table set a='a',b='b',c=1 where 1=1

欄位a,b,c已經能動態取出,a,b,1可以根據新的model 用 [model objectforkey:]方法獲取值。先簡單說這麼多,下面我通過乙個小demo來演示一下。

首先實現方法,分析類的字段屬性和型別,並存放到乙個nsdictionary中。

- (nsdictionary *)pz_getclasspropertywithclass:(class)c

[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];

}

然後隨便寫個model,呼叫方法如下:

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...