iOS基礎數據庫(已更新,這個有些亂就別看了)

iOS H5 PHP

數據庫管理系統

SQL: SQL 是Structured Query Language(結構化查詢語言)的縮寫,SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言.

常見的數據庫:

My SQL : MySQL是一個精巧的SQL數據庫管理系統優點:免費,輕量級

Oracle : ? 甲骨文公司的一款關系數據庫管理系統.系統可移植性好,使用方便,功能強.

數據庫特征:

以一定的方式存儲在一起(表結構)

能為多個用戶共享

具有盡可能少的冗余代碼

與程序彼此獨立的數據集合

數據庫(Database)是按照數據結構來組織,存儲和管理數據的倉庫.

數據庫分類

關系型數據庫(主流)

對象型數據庫

層次性數據庫

常用關系型數據庫: PC :Orcsle ,My SQL ,SQL Server.Access.DB2 ?;嵌入式:SQLite;

表: 是數據庫中一個非常重要的對象,是其他對象的基礎.

字段: 表的”列”成為”字段” , 每個字段包含某一專題的信息.

記錄: 是指對應于數據表中一行信息的一組完整的相關信息.

SQL語句

SQLite是無類型的數據庫,可以保存任何類型的數據,對于SQLite來說對字段不指定類型是完全有效的.

SQLite近似類規則


SQLite字段約束條件:

NOT NULL -非空(必填選項)

UNIQUE - 唯一(不能重復)

PRIMARY KEY - 主鍵(一般設置為integer或NSString;特點:1: NOT NULL 不為空 2: UNIQUE 不重復,(唯一標識))

FOREIGN KEY - 外鍵(該字段作為另一個表的主鍵,鏈表查詢)

AUTOINCREMENT - 自增量變量(一般設置Integer設置,它會自動根據上一條數據自增)

CHECK -條件檢查(確保一列中所有值滿足一定條件)

DEFAULT - 默認

表里可以沒有主鍵,主鍵不是必填選項,當把一個字段設置為PRIMARY KEY 那么這個字段為必填選項 (不可為空,不能重復)

SQL語句:

建表命令: (Create ?table)

數據插入命令:(Insert)

數據庫更新命令:(Update)

數據庫刪除命令:(Delete)

數據庫檢索命令:(Select)


字段類型一定要填


注:如果值是字符串或字符類型,需要用單引號括起來

update


update stu set gender = ‘ 女’ where gender = ‘男' ; ?整列修改

update stu set gender = ‘ 女’ where name = ‘班長' ; 單條修改

delete


從stu里刪除所有年齡為10的數據

查詢select


查詢一個表里所有數據當 ? select * from stu where name = ‘班長' ;

單例

#import"DataBaseHandle.h"

staticDataBaseHandle*dataBase =nil;

@interfaceDataBaseHandle()

@end

@implementationDataBaseHandle

//單例方法

+ (DataBaseHandle*)sharedDataBaseHandle{

if(dataBase==nil) {

dataBase= [[DataBaseHandlealloc]init];

}

returndataBase;

}

@property(nonatomic,copy)NSString* dbPath;

//懶加載

//獲取路徑 documents文件夾下的一個叫做person.sqlite

//重寫getter方法

-(NSString*)dbPath{

if(_dbPath==nil) {

NSString*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];

_dbPath= [documentPathStrstringByAppendingPathComponent:@"person.sqlite"];

}

return_dbPath;

}

數據庫技術的實現

流程

Linux系統級的SQLite技術實現框架:Build Phases —>Link With Libraries —>添加 —>sqlite —>libsqlite3.0.tbd

引入頭文件

打開數據庫

對數據庫,并進行操作(執行SQL命令 建表,增刪改查)

關閉數據庫

代碼實現:

staticsqlite3*db =nil;

.h

#import

@interfaceDataBaseHandle :NSObject

+ (DataBaseHandle*)sharedDataBaseHandle;

//返回自身

//命名一般用share和default開頭+類名

//打開數據庫

-(void)openDB;

//關閉數據庫

-(void)closeDB;

//創建表

-(void)createTable;

//插入一條數據

-(void)insertName:(NSString*)name

gender:(NSString*)gender

age:(NSInteger)age;

//通過UID更新一個數據

-(void)updateWithUID:(NSInteger)uid;

//通過UID刪除一個數據

-(void)deleteWithUID:(NSInteger)uid;

//搜索全部

-(void)searchAll;

//根據name查詢一條數據

-(void)searchWithName:(NSString*)name;

//根據gender查詢一條數據

-(void)searchWithGender:(NSString*)gender;

//根據age查詢一條數據

-(void)searchWithAge:(NSInteger)age;

@end

.m

打開數據庫

//初始化一個數據庫

-(void)openDB{

//打開數據庫的函數,在數據庫里所有字符串都要變成utf-8的格式

//第一個參數:路徑名,第一次用self. (懶加載),再用直接打就行了

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

if(result ==SQLITE_OK) {

NSLog(@"打開成功");

}else{

NSLog(@"打開失敗");

}

}

執行SQL命令

1.創建表

-(void)createTable{

//創建一個person表,要求字段: UID integer (主鍵,自增)? name text ,gender text ,age integer

NSString*createString =@"create table if not exists person(uid integer primary key autoincrement not null,name text,gender text,age integer)";

//參數1:數據庫

//參數2:create語句(UTF8修飾)

//參數3:結果的回調函數

//參數4:回調函數的參數

//參數5:錯誤信息

intresult =sqlite3_exec(db, createString.UTF8String,NULL,NULL,NULL);

if(result ==SQLITE_OK) {

NSLog(@"創建成功");

}else{

NSLog(@"創建失敗%d",result);

}

NSLog(@"_dbPath === %@",_dbPath);

}

2.插入一條數據

//插入一條數據.m

-(void)insertName:(NSString*)name

gender:(NSString*)gender

age:(NSInteger)age{

//插入數據的sql語句,數據不確定,所以在values里面使用'?'代替,之后向里面綁定

NSString*insertString =@"insert into person(name,gender,age)values(?,?,?)";

//伴隨指針

sqlite3_stmt*stmt =nil;

//預執行SQL語句

//參數1:數據庫

//參數2: SQL語句

//參數3:字節數;如果為負,表示取值取到碰到結束符號('\000','u000').

//參數4:伴隨指針.會伴隨著數據庫的操作,獲取之或者綁定值

//參數5:取值的時候如果取得不全,怎么余下的存入這里

intresult =sqlite3_prepare(db, insertString.UTF8String, -1, &stmt,NULL);

//如果預執行成功的話,那么就要往里面放數據了

if(result ==SQLITE_OK) {

//向預執行的SQL語句里面插入參數(取代'?'的位置)

//參數1:伴隨指針

//參數2:確定替代'?'的位置,從1開始

//參數3:插入數據

//參數4:取得字節數

//參數5:回調函數

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

//

sqlite3_bind_text(stmt, 2, gender.UTF8String, -1,NULL);

// int用int64方法

sqlite3_bind_int64(stmt, 3, age);

//SQL語句已寫全

//執行伴隨指針,如果為SQLITE_DONE代表執行陳宮,并且成功的插入數據.

if(sqlite3_step(stmt) ==SQLITE_DONE) {

NSLog(@"插入成功");

}else{

NSLog(@"插入失敗%d",result);

}

}

//最后,一定要記得釋放掉伴隨指針

sqlite3_finalize(stmt);

}

3.修改一條數據

//改

-(void)updateWithUID:(NSInteger)uid{

NSString*updateString =@"update person set name = '王軍' where uid = ?";

//伴隨指針

sqlite3_stmt*stmt =nil;

intresult =sqlite3_prepare(db, updateString.UTF8String, -1, &stmt,NULL);

if(result ==SQLITE_OK) {

sqlite3_bind_int64(stmt, 1, uid);

if(sqlite3_step(stmt) ==SQLITE_DONE) {

NSLog(@"修改成功");

}

}

sqlite3_finalize(stmt);

}

4.刪除一條數據

//刪

-(void)deleteWithUID:(NSInteger)uid{

NSString*deleteString = [NSStringstringWithFormat:@"delete from person where uid = %ld",uid];

intresult =sqlite3_exec(db, deleteString.UTF8String,NULL,NULL,NULL);

if(result ==SQLITE_OK) {

NSLog(@"刪除成功");

}else{

NSLog(@"刪除失敗");

}

}

5.查詢所有數據

//查

-(void)searchAll{

NSString*searchString =@"Select *from person";

//伴隨指針

sqlite3_stmt*stmt =nil;

intresult =sqlite3_prepare(db, searchString.UTF8String, -1, &stmt,NULL);

if(result ==SQLITE_OK) {

//當不知道循環次數,用while

//當sqlite3_step(stmt) ==SQLITE_ROW的時候,代表還有下一條數據

while(sqlite3_step(stmt) ==SQLITE_ROW) {

//參數2 :參數位置從零開始的

intuid =sqlite3_column_int(stmt, 0);

NSLog(@"%d",uid);

NSString*name = [NSStringstringWithUTF8String:(constchar*)sqlite3_column_text(stmt, 1)];

NSString*gender =[NSStringstringWithUTF8String:(constchar*)sqlite3_column_text(stmt, 2)];

NSIntegerage =sqlite3_column_int(stmt, 3);

NSLog(@"%@",name);

NSLog(@"%@",gender);

NSLog(@"%ld",age);

}

}

}

6.按照name查詢數據

-(void)searchWithName:(NSString*)name{

NSString*searchString =@"select uid,age,gender from person where name = ?";

//伴隨指針

sqlite3_stmt*stmt =nil;

//

intresult =sqlite3_prepare(db, searchString.UTF8String, -1, &stmt,NULL);

if(result ==SQLITE_OK) {

sqlite3_bind_text(stmt, 1, name.UTF8String, -1,NULL);//注 :真正的為SQL語句中 ? 綁定(name.UTF8String)值

while(sqlite3_step(stmt) ==SQLITE_ROW) {

intuid =sqlite3_column_int(stmt, 0);

NSLog(@"%d",uid);

//NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];

NSString*gender = [NSStringstringWithUTF8String:(constchar*)sqlite3_column_text(stmt, 2)];

NSIntegerage =sqlite3_column_int(stmt, 1);

//NSLog(@"%@",name);

NSLog(@"%@",gender);

NSLog(@"%ld",age);

}

}

sqlite3_finalize(stmt);

}

控制器

#import"ViewController.h"

#import"DataBaseHandle.h"

@interfaceViewController()

@end

@implementationViewController

- (void)viewDidLoad {

[superviewDidLoad];

DataBaseHandle*dataBase = [DataBaseHandlesharedDataBaseHandle];

[dataBaseopenDB];

[dataBasecreateTable];

[dataBaseinsertName:@"騷軍"gender:@"男"age:38];

[dataBaseupdateWithUID:1];

[dataBasedeleteWithUID:2];

}

@end

SQLite語法:

執行sql語句 :sqlite3_exec()可以執行任何SQL語句,比如創表,更新,插入和刪除操作.但是一般不用于它執行查詢語句,因為它不會返回查詢到的數據

預執行:

sqlite3_prepare( ) ? 這個函數將sql文本轉換成一個準備語句(prepared statement)對象,同時返回這個對象的指針.他實際上并不執行(evaluate)這個SQL語句,他僅僅為執行準備這個sql語句. ? <參數 1? db ?:數據庫指針 ? 參數 2? zSql : ?sql語句, 使用UTF-8編碼 ?參數 3 ?nByte : ?字節數,如果為負,則函數取出zSql中從開始到第一個終止符’\000’或’u000’ ? ? 參數4 ?ppStmt ?: 伴隨指針,能夠使用sqlite3_steo( )執行的編譯好的準備指針,如果錯誤發生,它被置為NULL ? ? 參數5 pzTail: ?參數3沒取完所有內容,剩下的存放到pzTail中 >

sqlite3_bind_*( ) ? ? 給宿主參數(host parameters) ?綁定值(* 代表不同類型) <參數1 : 伴隨指針 ?參數 2: 參數序號(從1開始) ?參數3: 參數值 ?參數 4: 參數長度 ?參數 5 : 函數指針,SQLITE3執行完操作后回調此函數,通常用于釋放字符串占用的內存>

sqlite3_step ( ) ? ? ? ?一次或多次來執行前面sqlite3_prepare 創建的準備語句<>

sqlite3_column( ) ? 這個過程從執行sqlite3_step( )執行一個準備語句得到的結果集的當前行中返回一個列. 每次sqlite3_step得到一個結果集的列停下后,這個過程就可以被多次調用去查詢這個行的各列的值. 對列操作是有多個函數,均以sqlite3_column為前綴 <參數 1 : 從sqlite3_prepare返回來的prepared statement對象的指針 ? ?參數 2 : 指定這一行中想要被返回的列的索引即(從0 開始)前面SQL語句字段順序的索引 (如果SQL 寫的* 則索引順序即表格里字段的順序, 如果不同則表示的是SQL語句中字段的順序)>

sqlite3_finalize( ) ? ?這個過程銷毀前面被sqlite3_prepare創建的準備語句,每個準備語句都必須使用這個函數去銷毀以防止內存泄露

#defineSQLITE_OK? ? ? ? ? ?0? ?/*?成功?|?Successful?result?*/

/*錯誤碼開始*/

#defineSQLITE_ERROR? ? ? ? 1? ?/*?SQL錯誤?或?丟失數據庫?|?SQL?error?or?missing?database?*/

#defineSQLITE_INTERNAL? ? ?2? ?/*?SQLite?內部邏輯錯誤?|?Internal?logic?error?in?SQLite?*/

#defineSQLITE_PERM? ? ? ? ?3? ?/*?拒絕訪問?|?Access?permission?denied?*/

#defineSQLITE_ABORT? ? ? ? 4? ?/*?回調函數請求取消操作?|?Callback?routine?requested?an?abort?*/

#defineSQLITE_BUSY? ? ? ? ?5? ?/*?數據庫文件被鎖定?|?The?database?file?is?locked?*/

#defineSQLITE_LOCKED? ? ? ?6? ?/*?數據庫中的一個表被鎖定?|?A?table?in?the?database?is?locked?*/

#defineSQLITE_NOMEM? ? ? ? 7? ?/*?某次?malloc()?函數調用失敗?|?A?malloc()?failed?*/

#defineSQLITE_READONLY? ? ?8? ?/*?嘗試寫入一個只讀數據庫?|?Attempt?to?write?a?readonly?database?*/

#defineSQLITE_INTERRUPT? ? 9? ?/*?操作被?sqlite3_interupt()?函數中斷?|?Operation?terminated?by?sqlite3_interrupt()?*/

#defineSQLITE_IOERR? ? ? ?10? ?/*?發生某些磁盤?I/O?錯誤?|?Some?kind?of?disk?I/O?error?occurred?*/

#defineSQLITE_CORRUPT? ? ?11? ?/*?數據庫磁盤映像不正確?|?The?database?disk?image?is?malformed?*/

#defineSQLITE_NOTFOUND? ? 12? ?/*?sqlite3_file_control()?中出現未知操作數?|?Unknown?opcode?in?sqlite3_file_control()?*/

#defineSQLITE_FULL? ? ? ? 13? ?/*?因為數據庫滿導致插入失敗?|?Insertion?failed?because?database?is?full?*/

#defineSQLITE_CANTOPEN? ? 14? ?/*?無法打開數據庫文件?|?Unable?to?open?the?database?file?*/

#defineSQLITE_PROTOCOL? ? 15? ?/*?數據庫鎖定協議錯誤?|?Database?lock?protocol?error?*/

#defineSQLITE_EMPTY? ? ? ?16? ?/*?數據庫為空?|?Database?is?empty?*/

#defineSQLITE_SCHEMA? ? ? 17? ?/*?數據結構發生改變?|?The?database?schema?changed?*/

#defineSQLITE_TOOBIG? ? ? 18? ?/*?字符串或二進制數據超過大小限制?|?String?or?BLOB?exceeds?size?limit?*/

#defineSQLITE_CONSTRAINT? 19? ?/*?由于約束違例而取消?|?Abort?due?to?constraint?violation?*/

#defineSQLITE_MISMATCH? ? 20? ?/*?數據類型不匹配?|?Data?type?mismatch?*/

#defineSQLITE_MISUSE? ? ? 21? ?/*?不正確的庫使用?|?Library?used?incorrectly?*/

#defineSQLITE_NOLFS? ? ? ?22? ?/*?使用了操作系統不支持的功能?|?Uses?OS?features?not?supported?on?host?*/

#defineSQLITE_AUTH? ? ? ? 23? ?/*?授權失敗?|?Authorization?denied?*/

#defineSQLITE_FORMAT? ? ? 24? ?/*?附加數據庫格式錯誤?|?Auxiliary?database?format?error?*/

#defineSQLITE_RANGE? ? ? ?25? ?/*?傳遞給sqlite3_bind()的第二個參數超出范圍?|?2nd?parameter?to?sqlite3_bind?out?of?range?*/

#defineSQLITE_NOTADB? ? ? 26? ?/*?被打開的文件不是一個數據庫文件?|?File?opened?that?is?not?a?database?file?*/

#defineSQLITE_ROW? ? ? ? ?100? /*?sqlite3_step()?已經產生一個行結果?|?sqlite3_step()?has?another?row?ready?*/

#defineSQLITE_DONE? ? ? ? 101? /*?sqlite3_step()?完成執行操作?|?sqlite3_step()?has?finished?executing?*/

/*錯誤碼結束*/

bind (vt. 綁;約束;裝訂;包扎;凝固)

prepare(vt. 準備;使適合;裝備;起草)

column(n. 縱隊,列;專欄)

exec(n. 執行,執行程序;)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容