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. 執行,執行程序;)