ios開發中,經常會用到資料庫sqlite的知識,除了增,刪,改,查之外,我們說說如何獲取資料庫中有多少表和表相關的內容。跟資料庫使用相關的一般的增刪改查的語句,這裡就不做解釋了。在網上有很多。記得之前專案中曾經有這樣的乙個場景。乙個資料庫中存在了好幾個表。假定我們不知道表名的前提下來獲取這些資料。
下來看看資料庫結構:
我們可以看到,在這個資料庫檔案中一共有10個表。我們的目的就是獲取這些表中的內容。
在這裡我們使用的是fmdb來操作的。我們下開啟乙個資料庫。
nsstring *smspaht = [[nsbundle mainbundle] pathforresource:@"sms" oftype:@"sqlite"];
fmdatabase *db = [fmdatabase databasewithpath:smspaht];
if ([db open])
我們已經開啟了資料庫,眾所周知fmdb使用executequery
來呼叫資料庫語句。在這裡就不賣關子了。查詢乙個資料庫中的所有的表的語句為:
resultset = [db executequery:@"select * from sqlite_master where
type='table';"];
在fmresultset這個物件中有乙個屬性columnnametoindexmap
。它是乙個nsmutabledictionary物件。其中key表示的是指定結果集中對應列的名稱,value表示的是指定結果集中對應的列號(columnidx)。我們列印出來可以看到:
後邊我們獲取表名的時候,就用到了name = 1 這個字段。我們看下邊的**:
nsstring smspaht = [[nsbundle mainbundle] pathforresource:@」sms」 oftype:@」sqlite」];
fmdatabase db = [fmdatabase databasewithpath:smspaht];
if ([db open])
}
列印結果為:
2016-08-26 15:20:05.909 ***x[5255:190053] table,sqlite_sequence,sqlite_sequence,3,create
table sqlite_sequence(name,seq)
2016
-08-26
15:20:05.910 ***x[5255:190053] table,member,member,4,create
table
'member'(
[id] integer primary key autoincrement,
[recordid] integer,
[groupid] integer
)2016
-08-26
15:20:05.910 ***x[5255:190053] table,groups,groups,2,create
table
groups (
[id] integer primary key autoincrement,
[name] varchar (100)
)2016
-08-26
15:20:05.911 ***x[5255:190053] table,blessing,blessing,5,create
table blessing(title text primary key, content
text)
2016
-08-26
15:20:05.911 ***x[5255:190053] table,festivel,festivel,83,create
table festivel(title text primary key, content
text)
2016
-08-26
15:20:05.911 ***x[5255:190053] table,funny,funny,357,create
table funny(title text primary key, content
text)
2016
-08-26
15:20:05.913 ***x[5255:190053] table,love,love,419,create
table love(title text primary key, content
text)
2016
-08-26
15:20:05.944 ***x[5255:190053] table,other,other,449,create
table other(title text primary key, content
text)
2016
-08-26
15:20:05.944 ***x[5255:190053] table,xiaoyuan,xiaoyuan,607,create
table xiaoyuan(title text primary key, content
text)
2016
-08-26
15:20:05.944 ***x[5255:190053] table,yuehui,yuehui,642,create
table yuehui(title text primary key, content
text)
2016
-08-26
15:20:05.944 ***x[5255:190053] table,zhichang,zhichang,670,create
table zhichang(title text primary key, content
text)
通過對比columnnametoindexmap
中的內容,大家應該看明白了吧。我們就是通過nsstring *str1 = [resultset stringforcolumnindex:1];
來獲取表名的。
nsstring *smspaht = [[nsbundle mainbundle] pathforresource:@"sms" oftype:@"sqlite"];
fmdatabase *db = [fmdatabase databasewithpath:smspaht];
if ([db open])
nsmutabledictionary *result = [nsmutabledictionary dictionary];
for (nsstring *tablename in tablenames) }}
result[tablename] = dict;
}nsdata *jsondata = [nsjsonserialization datawithjsonobject:result options:0 error:null];
if (!jsondata)
nsstring *jsonstr = [[nsstring alloc] initwithdata:jsondata encoding:nsutf8stringencoding];
qkylog(@"%@",jsonstr);
}
上邊的**僅作參考,在實際開發中會根據不同的資料結構有不用的寫法。但是我們的目的主要是懂得如何去獲取資料。
最終解析出的json資料為:
,
"groups": {},
"xiaoyuan": {
"校園": [
"上課瞌睡過度,眼皮打架無數,實在支援不住,誤入夢境深處,呼嚕,呼嚕,驚起同學全部",
"校園風光如此多驕,引無數情侶盡彎腰,惜龍女楊過,牛郎織女略輸一等,一代大傻韋小寶盡拿靈通發簡訊!",
"大學中永恆的愛情如鑽石一般的少,大多是:只因思顏意,未求終生緣!",
"有風的日子,不妨出去走走。不妨放鬆呼吸,走向絢麗陽光,把發黃的",
"心事交給流水,向遠去的霧靄行個注目禮。",
"逝去的年華在風中搖曳,楓樹下依舊殘留著她暖暖的氣息,緊緊的抱著她,卻發現眼前只有紛紛落下的楓葉.",
"我們的校園生活像一支旋律,它是熱情,快樂和友愛的組裝,是激越,奔放,令人陶醉的交響樂.",
"校園是我的一架鋼琴,作息是鋼琴的一副踏板,放飛的心是起伏的琴鍵,苦辣酸甜是多彩的樂章",
"我願青春如校園春雨中的牡丹,夏夜幽靜處的白蘭,秋風微露裡的海棠,漫天飛雪中的寒梅.",
"虎子最近上火連續兩天上課鼻出血,昨天當鈴響起虎子鼻血再次噴出同桌小青很是關心:你的週期咋那麼準?",
"路是自己走出來的:愛情是自己努力得來的:前途是自己拼出來的,你要努力啊",
"忘了,忘了吧,忘掉所有的不愉快,我們都非聖賢,在我心底,依然珍惜...",...
**: iOS FMDB 資料庫 詳解
一 簡單說明 1.什麼是fmdb fmdb是ios平台的sqlite資料庫框架 fmdb以oc的方式封裝了sqlite的c語言api 2.fmdb的優點 使用起來更加物件導向,省去了很多麻煩 冗餘的c語言 對比蘋果自帶的core data框架,更加輕量級和靈活 提供了多執行緒安全的資料庫操作方法,有...
iOS FMDB 資料庫相關
在iphone上是採用sqlite進行資料儲存是我一種比較習慣性的做法。一般在其他平台也比較習慣用sqlite,比如android。而iphone上有一些封裝好的第三方框架提供使用,更節省了許多時間。如 sqlitepersistentobjects fmdb。今天查詢了這個兩個框架,感覺fmdb的...
iOS FMDB資料庫加密相關
資料庫加密一般有兩種方式 1 對所有資料進行加密 2 對資料庫檔案加密 處於客戶端效能的考慮,通常我們對資料庫檔案進行加密,在ios上用的比較多的是 sqlcipher,由於原生提供的sqlite api是c語言實現的,通常我們會用乙個在github上比較有名的乙個工具庫fmdb,fmdb對原生的s...