菜鳥教程——iOS SQLite操作

//? 定義一個靜態(tài)區(qū)指針 連接數(shù)據(jù)庫 讓數(shù)據(jù)庫再程序結(jié)束后自動釋放

staticsqlite3*db?=nil;

-?(sqlite3*)openDB

{

//??說明已經(jīng)打開數(shù)據(jù)庫

if(db?!=nil)?{

returndb;

}

//??創(chuàng)建數(shù)據(jù)庫

//??先搞路徑

NSString*dbPath?=?[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"Student.sqlite"];

NSLog(@"%@",dbPath);

//??如果沒有Student.sqlite文件?會創(chuàng)建一個

intresult?=?sqlite3_open(dbPath.UTF8String,?&db);

if(result?==?SQLITE_OK)?{

NSLog(@"打開數(shù)據(jù)庫成功");

}else{

NSLog(@"打開數(shù)據(jù)庫失敗");

}

returndb;

}

-?(void)closeDB

{

intresult?=?sqlite3_close(db);

if(result?==?SQLITE_OK)?{

//??把指針?重置為空?方便下次打開

db?=nil;

NSLog(@"關(guān)閉數(shù)據(jù)庫成功");

}else{

NSLog(@"關(guān)閉數(shù)據(jù)庫失敗");

}

}

//??創(chuàng)建表

-?(void)createTable

{

//?1.打開數(shù)據(jù)庫

db?=?[self openDB];

//??2.寫sql語句?根據(jù)model?創(chuàng)建表

//??create?table?Student?(Student?是表名)

//??number?integer?primary?key?not?NULL?主鍵值?如果不操作?自增

NSString*sql?=@"create?table?IF?NOT?EXISTS?lanOuStudent(number?integer?primary?key?not?NULL,?name?text?not?NULL,?gender?text?not?NULL,?age?integer?not?NULL)";

//??3.執(zhí)行sql語句?創(chuàng)建表

/**

*??第1個參數(shù)不再說了,是前面open函數(shù)得到的指針竣贪。說了是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)唆涝。

第2個參數(shù)constchar*sql是一條sql?語句溉愁,以\0結(jié)尾。

第3個參數(shù)sqlite3_callback?是回調(diào)抒和,當(dāng)這條語句執(zhí)行之后,sqlite3會去調(diào)用你提供的這個函數(shù)。

第4個參數(shù)void*是你所提供的指針亏镰,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面拯爽,如果不需要傳遞指針給回調(diào)函數(shù)索抓,可以填NULL。等下我們再看回調(diào)函數(shù)的寫

法毯炮,以及這個參數(shù)的使用逼肯。

第5個參數(shù)char**?errmsg?是錯誤信息。

*

*/

intresult?=?sqlite3_exec(db,?sql.UTF8String,NULL,NULL,NULL);

if(result?==?SQLITE_OK)?{

NSLog(@"創(chuàng)建表成功");

}else{

NSLog(@"創(chuàng)建表失敗");

}

//??4.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

}

//??插入數(shù)據(jù)

-?(void)insertWithStudent:(LanOuStudent*)student

{

//??1.打開數(shù)據(jù)庫

db?=?[selfopenDB];

//??2.寫sql語句

NSString*sql?=?[NSStringstringWithFormat:@"insert?into?lanOuStudent(name?,gender?,age?,?number)?values('%@'?,'%@'?,?'%ld'?,?'%ld')",student.name,student.gender,student.age,student.number];

//??3.執(zhí)行語句

intresult?=?sqlite3_exec(db,?sql.UTF8String,NULL,NULL,NULL);

if(result?==?SQLITE_OK)?{

NSLog(@"插入成功");

}else{

NSLog(@"插入失敗");

}

//??4.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

}

//??刪除數(shù)據(jù)

-?(void)deleteWithAge:(NSInteger)age

{

//??1.打開數(shù)據(jù)庫

db?=?[selfopenDB];

//??2.寫sql語句

NSString*sql?=?[NSStringstringWithFormat:@"delete?from?lanOuStudent?where?age?>?'%ld'",age];

//??3.執(zhí)行語句

intresult?=?sqlite3_exec(db,?sql.UTF8String,NULL,NULL,NULL);

if(result?==?SQLITE_OK)?{

NSLog(@"刪除成功");

}else{

NSLog(@"刪除失敗");

}

//??4.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

}

//??更改數(shù)據(jù)??根據(jù)名字?更改學(xué)號

-?(void)updateName:(NSString*)namebyAge:(NSInteger)age

{

//??1.打開數(shù)據(jù)庫

db?=?[selfopenDB];

//??2.寫sql語句??where?后面是根據(jù)什么

NSString*sql?=?[NSStringstringWithFormat:@"update?lanOuStudent?set?age?=?'%ld'?where?name?=?'%@'",age,name];

//??3.執(zhí)行語句

intresult?=?sqlite3_exec(db,?sql.UTF8String,NULL,NULL,NULL);

if(result?==?SQLITE_OK)?{

NSLog(@"更改成功");

}else{

NSLog(@"更改失敗");

}

//??4.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

}

//??查詢學(xué)生??根據(jù)名字和學(xué)號

-?(LanOuStudent*)queryStudentWithName:(NSString*)nameage:(NSInteger)age

{

//??1.打開數(shù)據(jù)庫

db?=?[selfopenDB];

//??2.寫sql語句??*表示?查詢所有字段

NSString*sql?=?[NSStringstringWithFormat:@"select?*?from?lanOuStudent?where?name?=?'%@'?and?age?=?'%ld'",name,age];

//??3.創(chuàng)建跟隨指針?保存sql語句

sqlite3_stmt*stmt?=nil;

//??4.執(zhí)行語句

//??-1?指sql語句長度?可以無限長

//??&stmt?跟隨指針?地址

//??第四個參數(shù)?截取sql語句未使用部分

intresult?=?sqlite3_prepare_v2(db,?sql.UTF8String,?-1,?&stmt,NULL);

//??5.判斷語句是否正確

if(result?==?SQLITE_OK)?{

NSLog(@"查詢語句正確");

//??6.進(jìn)行查詢值的綁定?也就是問號??的綁定

//??第二個參數(shù)?指第幾個問號?從1開始

sqlite3_bind_text(stmt,1,?name.UTF8String,?-1,NULL);

sqlite3_bind_int(stmt,2,?(int)age);//??注意轉(zhuǎn)換類型

//??7.進(jìn)行查詢

//??如果?查詢結(jié)果?返回?SQLITE_ROW?那么查詢正確?執(zhí)行循環(huán)

while(sqlite3_step(stmt)?==?SQLITE_ROW)?{

//??8.滿足條件?讀取數(shù)據(jù)

//??第二個參數(shù)?指的是?表中的列數(shù)?從0開始

charchar*name?=?(charchar*)sqlite3_column_text(stmt,1);

charchar*gender?=?(charchar*)sqlite3_column_text(stmt,2);

intage?=?sqlite3_column_int(stmt,3);

intnumber?=?sqlite3_column_int(stmt,0);

//??9.賦值學(xué)生對象?字符串需要轉(zhuǎn)換格式

LanOuStudent*student?=?[[LanOuStudentalloc]init];

student.name=?[NSStringstringWithUTF8String:name];

student.gender=?[NSStringstringWithUTF8String:gender];

student.age=?age;

student.number=?number;

//??10.釋放跟隨指針

sqlite3_finalize(stmt);

returnstudent;

}

}else{

NSLog(@"查詢語句錯誤");

}

//??查詢語句錯誤?也要釋放跟隨指針

sqlite3_finalize(stmt);

//??11.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

returnnil;

}

//??查詢?nèi)繉W(xué)生

-?(NSArray*)queryAllStudent

{

//??1.打開數(shù)據(jù)庫

db?=?[selfopenDB];

//??2.寫sql語句

NSString*sql?=@"select?*?from?lanOuStudent";

//??3.創(chuàng)建跟隨指針

sqlite3_stmt*stmt?=nil;

//??4.執(zhí)行語句

intresult?=?sqlite3_prepare_v2(db,?sql.UTF8String,?-1,?&stmt,NULL);

//??5.判斷語句是否正確

if(result?==?SQLITE_OK)?{

NSLog(@"查詢語句正確");

//??6.創(chuàng)建數(shù)組

NSMutableArray*array?=?[NSMutableArrayarray];

//??7.執(zhí)行查詢

while(sqlite3_step(stmt)?==?SQLITE_ROW)?{

//??8.滿足條件?讀取數(shù)據(jù)

charchar*name?=?(charchar*)sqlite3_column_text(stmt,1);

charchar*gender?=?(charchar*)sqlite3_column_text(stmt,2);

intage?=?sqlite3_column_int(stmt,3);

intnumber?=?sqlite3_column_int(stmt,0);

//??9.賦值學(xué)生對象?字符串需要轉(zhuǎn)換格式

LanOuStudent*student?=?[[LanOuStudentalloc]init];

student.name=?[NSStringstringWithUTF8String:name];

student.gender=?[NSStringstringWithUTF8String:gender];

student.age=?age;

student.number=?number;

//??10.裝進(jìn)數(shù)組

[arrayaddObject:student];

//??11.釋放學(xué)生對象

[studentrelease];

}

//??12.釋放跟隨指針

sqlite3_finalize(stmt);

returnarray;

}else{

NSLog(@"查詢語句錯誤");

}

//??查詢語句錯誤?也要釋放跟隨指針

sqlite3_finalize(stmt);

//??11.關(guān)閉數(shù)據(jù)庫

[selfcloseDB];

returnnil;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桃煎,一起剝皮案震驚了整個濱河市篮幢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌备禀,老刑警劉巖洲拇,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曲尸,居然都是意外死亡赋续,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門另患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽乱,“玉大人,你說我怎么就攤上這事昆箕⊙涣校” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵鹏倘,是天一觀的道長薯嗤。 經(jīng)常有香客問我,道長纤泵,這世上最難降的妖魔是什么骆姐? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上玻褪,老公的妹妹穿的比我還像新娘肉渴。我一直安慰自己,他們只是感情好带射,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布同规。 她就那樣靜靜地躺著,像睡著了一般窟社。 火紅的嫁衣襯著肌膚如雪券勺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天桥爽,我揣著相機(jī)與錄音朱灿,去河邊找鬼。 笑死钠四,一個胖子當(dāng)著我的面吹牛盗扒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缀去,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侣灶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缕碎?” 一聲冷哼從身側(cè)響起褥影,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咏雌,沒想到半個月后凡怎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡赊抖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年统倒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氛雪。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡房匆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出报亩,到底是詐尸還是另有隱情浴鸿,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布弦追,位于F島的核電站岳链,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劲件。R本人自食惡果不足惜宠页,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一左胞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧举户,春花似錦、人聲如沸遍烦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽服猪。三九已至供填,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢猪,已是汗流浹背近她。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留膳帕,地道東北人粘捎。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像危彩,于是被迫代替她去往敵國和親攒磨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容