iOS SQL數據庫操作


經典SQL語句大全:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html

 

1.常用語句

***SQL語句的預編譯:將語句轉為數據流,執行語句前檢查語句的語法,但不能知道語句是否能查出結果。此方法有返回值  預編譯成功則返回SQLITE_OK----0否則返回SQLITE_ERROR----1
int sqlite3_prepare_v2(
  sqlite3 *db,                 //指向數據庫的指針
  const char *zSql,         //SQL語句
  int nByte,                   //SQL語句的長度 (一般用-1,系統可以自動算出字符串得長度)
  sqlite3_stmt **ppStmt, //指向語句的指針
  const char **pzTail       //SQL中沒有用到的一部分,一般為空
);
***SQL語句的值綁定。
*此類方法均有返回值  預編譯成功則返回SQLITE_OK----0否則返回SQLITE_ERROR----1
//對整數值的綁定
int sqlite3_bind_int(
sqlite3_stmt*,            //指向語句的指針
int,                      //占位符的序號(從1開始以此類推)
int                       //綁定的值
);
//對字符串值的綁定
int sqlite3_bind_text(
sqlite3_stmt*,            //指向語句的指針
int,                      //占位符的序號(從1開始以此類推)
const char*,              //要綁定的值(這里要c類型的字符串(CString),一般我們使用的是oc的字符串(NSString*)要通過- (__strong const char *)UTF8String轉一下就可以了)
int n,                    //該字符串的長度(一般用-1,系統可以自動算出字符串得長度)
void(*)(void*)            //回調函數(這里博主還沒用過所以不是很了解以后會慢慢更新)
);
//對二進制數據值的綁定
int sqlite3_bind_blob(
sqlite3_stmt*,            //指向語句的指針
int,                      //占位符的序號(從1開始以此類推)
const void*,              //要綁定的值(這里要的是c類型的比特(Byte),一般我們使用的是oc的NSDATA(NsData*)要通過- (const void *)bytes轉一下就可以了)
int n,                    //數據的長度(用- (NSUInteger)length得到  這里為什么不用-1呢?因為-1對於算字符串長度在行,其他的不一定准所以這里我們手動算出數據的長度)
void(*)(void*)            //回調函數(這里博主還沒用過所以不是很了解以后會慢慢更新)
);
***SQL語句的取值(從數據庫中對每一列取值)
//對整數字段的取值
int sqlite3_column_int(
sqlite3_stmt*,            //指向語句的指針
int iCol                  //數據庫中表中列的序號(從0開始以此類推)
);
//對字符串字段的取值
*注意這里我們取得是無符號的c字符串我們要先轉為有符號C字符串再轉為OC字符串
例sname為oc字符串
NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];

const unsigned char *sqlite3_column_text(
sqlite3_stmt*,            //指向語句的指針
int iCol                  //數據庫中表中列的序號(從0開始以此類推)
);
//對二進制字段的取值
*注意這里我們取得是c二進制我們要轉為oc二進制(我們要將byte(c)轉為nsdata(oc)通過+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;因為這里需要數據的長度所以需要調用int sqlite3_column_bytes(sqlite3_stmt*, int iCol);獲取數據的長度)

int length=sqlite3_column_bytes(stmt,3);//獲取二進制數據的長度
NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //將二進制數據轉換位NSData對象
 
const void *sqlite3_column_blob(
sqlite3_stmt*,            //指向語句的指針
int iCol                  //數據庫中表中列的序號(從0開始以此類推)
);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
******************************************新建一個類(Student*)
包含以下屬性
@property(retain,nonatomic)NSString*sname;
@property(assign,nonatomic)int sage;
@property(retain,nonatomic)NSData*simage;
@property(assign,nonatomic)int sid;
1.數據庫的全表查詢
+(NSMutableArray*) findall//返回表中所有記錄
{
    NSMutableArray* stuArray;//存儲查詢結果  在這里只聲明不開辟空間 等用的時候再開辟(節省空間)
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫  並且定義了一個指針sqlite指向dbpoint所指向的區域(數據庫)
    sqlite3_stmt *stmt=nil;//定義一個指向sql語句的指針對象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象  sqlite:數據庫 -1:系統自動算出要存的sql語句的長度(也可以自己給出) &stmt:一個指向sql語句的內存的地址  nil:sql語句中沒有用到的一部分(一般為空) 返回值為一個int(宏)SQLITE_OK 0  SQLITE_ERROR 1
    if (flag==SQLITE_OK) //預編譯成功
    {
        stuArray=[[NSMutableArray alloc]init];//為數組開辟空間
        while (sqlite3_step(stmt)==SQLITE_ROW) //開始指向第一行的上面 判斷下一行是否存在(存在:做准備指針移到下一行)(不存在:跳出循環)
        {
            int sid1=sqlite3_column_int(stmt, 0);//獲取表中當前行第一列的值
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname1=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//獲取當前表中當前行第二列的值
            //sqlite3_column_text(stmt, 1):返回的是一個無符號c字符串  (const char *)進行強轉為有符號c字符串  stringWithUTF8String:將一個c字符串轉為nsstring類型
            int length=sqlite3_column_bytes(stmt,3);//獲取二進制數據的長度 sqlite3_column_bytes():獲取當前行某一列的所占內存的字節數
            NSData *img1=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //將二進制數據轉換位NSData對象
            //sqlite3_column_blob(stmt, 2):返回的是byte型(c) dataWithBytes:length:將(c)二進制轉為nsdata(oc)

            //定義一個(Student*)對象並將從數據庫取來的數據賦值給對象的相應屬性
            Student *stu=[[Student alloc]init];//實例化
            stu.sid=sid1;
            stu.sname=sname1;
            stu.simage=img1;
            stu.sage=sage;
            [stuArray addObject:stu];//將一個對象存入數組
            [stu release];//釋放對象
        }
    }
    sqlite3_finalize(stmt);//回收stmt對象
    return [stuArray autorelease];//返回包含學生信息的數組  並設為自動釋放
}
2.通過姓名或者學號查詢
*注意這里學號是主鍵所以肯定查回來是有唯一確定的(Student*)對象
+(Student*) findbysid:(int) sid
{
    Student *stu;//用於返回的學生對象
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫
    sqlite3_stmt *stmt=nil;//定義sql語句對象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuid=?", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_int(stmt, 1, sid);//給問號占位符賦值
        while (sqlite3_step(stmt)==SQLITE_ROW)//因為一個學號肯定對應一個學生所以這里其實只執行一次
        {
            //根據列順序(從零開始)
            int sid=sqlite3_column_int(stmt, 0);//取整型數據
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring數據
            int length=sqlite3_column_bytes(stmt,3);//獲取二進制數據的長度
            NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //將二進制數據轉換位NSData對象
            //將從數據庫中查詢來的數據存到(Student*)對象中,用於返回 
            stu=[[Student alloc]init];//此時開辟空間節省內存
            stu.sid=sid;
            stu.sname=sname;
            stu.simage=img;
            stu.sage=sage;
        }
    }
    sqlite3_finalize(stmt);//回收stmt對象
    return [stu autorelease];//返回包含學生信息的對象
}
*注意這里一般學生姓名並不是唯一標示所以可能會查到多條記錄符合條件所以要返回一個數組來存儲符合條件的(Student*)對象  但現在我們的數據庫不涉及重名的事例所以這里只返回學生對象
+(Student*) findbysname:(NSString*)sname
{
    Student *stu;//用於返回的學生對象
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫
    sqlite3_stmt *stmt=nil;//定義sql語句對象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuname=?", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [sname UTF8String], -1, nil);//給問號占位符賦值
        while (sqlite3_step(stmt)==SQLITE_ROW)
        {
            //根據列順序(從零開始)
            int sid=sqlite3_column_int(stmt, 0);//取整型數據
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring數據
            int length=sqlite3_column_bytes(stmt,3);//獲取二進制數據的長度
            NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //將二進制數據轉換位NSData對象 
            stu=[[Student alloc]init];//此時開辟空間節省內存
            stu.sid=sid;
            stu.sname=sname;
            stu.simage=img;
            stu.sage=sage;
        }
    }
    sqlite3_finalize(stmt);//回收stmt對象
    return [stu autorelease];//返回包含學生信息的(Student*)對象
}
3.向數據庫增加一條記錄
+(void) insertstudent:(NSString*) name age:(int)age image:(NSData*)image
{
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫
    sqlite3_stmt *stmt=nil;//定義sql語句對象
    int flag=sqlite3_prepare_v2(sqlite, "insert into tblstudent(stuname,stuage,stuimage) values(?,?,?)", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象  多值綁定逗號隔開
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [name UTF8String],-1,nil);//給問號占位符賦值
        sqlite3_bind_int(stmt, 2, age);//對整型數據的綁定
        sqlite3_bind_blob(stmt, 3, [image bytes], [image length], nil);//對二進制類型數據的綁定 數據的字節數(-1 針對字符串的長度比較准)
        if(sqlite3_step(stmt)==SQLITE_ERROR)//執行insert動作
        {
            NSLog(@"insert error");
        }
    }
    sqlite3_finalize(stmt);//回收stmt對象
}
4.修改更新數據庫的數據
*注意更新數據庫時要通過一定的限制條件來確定要更新的記錄,可能是一條也可能是多條,當要更新的記錄是多條時要注意所有符合條件的記錄都會改為你定義的值。
+(void) updatestudent:(Student*) stu
{
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫
    sqlite3_stmt *stmt=nil;//定義sql語句對象
    int flag=sqlite3_prepare_v2(sqlite, "update tblstudent set stuname=?,stuage=?,stuimage=? where stuid=?", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [stu.sname UTF8String],-1,nil);//給問號占位符賦值
        //stu.sname為nsstring    UTF8String    nsstring---->ctring
        sqlite3_bind_int(stmt, 4, stu.sid);//給問號占位符賦值
        sqlite3_bind_int(stmt, 2, stu.sage);//給年齡賦值
        sqlite3_bind_blob(stmt, 3, [stu.simage bytes], [stu.simage length], nil);
        if(sqlite3_step(stmt)==SQLITE_ERROR)//執行update動作
        {
            NSLog(@"update error");
        }
        sqlite3_finalize(stmt);//回收stmt對象
    }
}
5.刪除數據庫的記錄
*注意刪除數據庫的記錄時要通過一定的限制條件來確定要刪除的記錄,可能是一條也可能是多條,當要刪除的記錄是多條時要注意所有符合條件的記錄都會被刪除。
+(void) deletebysid:(int) sid
{
    sqlite3 *sqlite=[DataBase OpenDB];//打開數據庫
    sqlite3_stmt *stmt=nil;//定義sql語句對象
    int flag=sqlite3_prepare_v2(sqlite, "delete from tblstudent where stuid=?", -1, &stmt, nil);//調用預處理函數將sql語句賦值給stmt對象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_int(stmt, 1, sid);//給問號占位符賦值  1.語句2.占位符的序號3.給占位符賦得值
        //執行delete動作
        if(sqlite3_step(stmt)==SQLITE_ERROR)//未執行成功
        {
            NSLog(@"delete error");
        }
    }
    sqlite3_finalize(stmt);//回收stmt對象
   
    NSLog(@"刪除了第%d",sid);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM