iOS中實現(xiàn)SQLite的增石洗、刪、改紧显、查

SQLite :輕量級數(shù)據(jù)庫讲衫,與其他數(shù)據(jù)庫管理系統(tǒng)不同,其安裝和運行非常簡單孵班,我們以創(chuàng)建Student類為例 通過SQLite數(shù)據(jù)庫實現(xiàn)對Student實例變量的增涉兽,刪,改篙程,查等操作

Student類

#import <Foundation/Foundation.h>
@interface Student : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@property(nonatomic,assign)int age;
@property(nonatomic,assign)int Stu_ID;
-(instancetype)initWithName:(NSString *)name
                        age:(int)age
                     gender:(NSString *)gender
                     stu_ID:(int)stu_ID;
@end

#import "Student.h"
@implementation Student
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
//重寫description
-(NSString *)description{
    return [NSString stringWithFormat:@"%@,%@,%d,%d",_name,_gender,_age,_Stu_ID];
}
//初始化
-(instancetype)initWithName:(NSString *)name age:(int)age gender:(NSString *)gender stu_ID:(int)stu_ID{
    if (self = [super init]) {
        _name = name;
        _age = age;
        _gender = gender;
        _Stu_ID = stu_ID;
    }return self;
}
@end

SQLite創(chuàng)建Database 聲明和實現(xiàn)基本的方法 代碼如下:

#import <Foundation/Foundation.h>
@class Student;

@interface Database : NSObject

//創(chuàng)建單例
+(instancetype)sharedDataBase;
-(void)openDB;
-(void)closeDB;
//添加
-(void)insertStudent:(Student *)stu;
//刪除
-(void)deleteStudent:(int )stu_ID;
//修改
-(void)updataStudentWithGender:(NSString *)gender andStu_ID:(int)stu_ID;
//選擇全部
-(NSArray *)selectAll;
//選擇學生單個
-(Student *)selectStudentWithStu_ID:(int)stu_ID;
@end

Database.m 以下對數(shù)據(jù)操作的各個方法做了較為詳細的介紹

#import "Database.h"
#import <sqlite3.h>
#import "Student.h"
@implementation Database
static Database *dataBase = nil;
+(instancetype)sharedDataBase{
    //加鎖
    @synchronized(self) {
        if (nil == dataBase) {
            dataBase = [[Database alloc]init];
            [dataBase openDB];//打開數(shù)據(jù)庫
        }
    }
    return dataBase;
}
#pragma mark--------//創(chuàng)建數(shù)據(jù)庫對象
static sqlite3 *db = nil;
-(void)openDB{
    //如果數(shù)據(jù)庫已經(jīng)打開 則不需要執(zhí)行后面的操作 直接return
    if (db!= nil) {
        return;
    }
    //創(chuàng)建保存數(shù)據(jù)庫的路徑
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    documentPath = [documentPath stringByAppendingString:@"/LOClass.sqlite"];
    NSLog(@"%@",documentPath);
    //如果改數(shù)據(jù)庫存在 則直接打開 否則 自動創(chuàng)建一個數(shù)據(jù)庫
    int result = sqlite3_open([documentPath UTF8String], &db);
    if (result == SQLITE_OK) {
//        NSLog(@"數(shù)據(jù)庫成功打開");
        //建表
        NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";
        //執(zhí)行語句
        sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL);
    }else{
        NSLog(@"%d",result);
    }
}
//關(guān)閉數(shù)據(jù)庫
-(void)closeDB{
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"數(shù)據(jù)庫關(guān)閉成功");
        //當關(guān)閉數(shù)據(jù)庫的時候?qū)?shù)據(jù)庫置為nil 是因為打開數(shù)據(jù)庫的時候需要使用nil做判斷 循環(huán)的理論
        db = nil;  //數(shù)據(jù)庫是在靜態(tài)去
    }else{
        NSLog(@"數(shù)據(jù)庫關(guān)閉失敗%d",result);
    }
}
//插入單個student對象
-(void)insertStudent:(Student *)stu{
    // 1 打開數(shù)據(jù)庫
    [self openDB];
    // 2 創(chuàng)建跟隨指針(也叫伴隨指針)
    sqlite3_stmt *stmt = nil;
    // 3 準備SQL語句  問好就是占位  枷畏??虱饿?拥诡??
    NSString *sqlString = @"insert into Class43 (Stu_ID, name, gender, age) values (?, ?, ?, ?)";
    // 4 驗證SQL語句的正確性
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    // 5 綁定
    if (result == SQLITE_OK) {
        NSLog(@"數(shù)據(jù)庫添加成功");
        //一旦SQL語句沒有問題就要開始綁定數(shù)據(jù)替換 氮发?
        #pragma mark ---第一個參數(shù)是跟隨指針 第二個參數(shù)是 袋倔?的順序 是從1開始的-第三個是要綁定的值--
        sqlite3_bind_int(stmt, 1, stu.Stu_ID);
        sqlite3_bind_text(stmt, 2, [stu.name UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 3, [stu.gender UTF8String], -1, NULL);
        sqlite3_bind_int(stmt, 4, stu.age);
    //6 單步執(zhí)行 將伴隨指針傳進去
        sqlite3_step(stmt);
    }else{
        NSLog(@"數(shù)據(jù)庫添加失敗%d",result);
    }
    //7 釋放跟隨指針占用的內(nèi)存
    sqlite3_finalize(stmt);
}
//刪除學生對象
-(void)deleteStudent:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmp = nil;
    NSString *sqlString = @"delete from Class43 where Stu_ID = ?";
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmp, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"數(shù)據(jù)庫是刪除成功");
        //開始綁定
        sqlite3_bind_int(stmp, 1, stu_ID);
        sqlite3_step(stmp);
    }else{
        NSLog(@"數(shù)據(jù)庫刪除失敗");
    }
    sqlite3_finalize(stmp);
}
//更新學生信息 在此根據(jù)學號改變學生性別
-(void)updataStudentWithGender:(NSString *)gender andStu_ID:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sql = @"update Class43 set gender = ? where Stu_ID = ?";
    int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"修改成功");
        sqlite3_bind_text(stmt, 1,[gender UTF8String], -1, nil);
        sqlite3_bind_int(stmt, 2, stu_ID);
        sqlite3_step(stmt);
    }else{
        NSLog(@"修改失敗");
    }
    sqlite3_finalize(stmt);
}
//查詢所有數(shù)據(jù)庫中
-(NSArray *)selectAll{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sql = @"select * from Class43";
    int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查詢?nèi)砍晒?);
        //創(chuàng)建可變數(shù)組用來存放查詢到的學生
        NSMutableArray *muArray = [NSMutableArray array];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //根據(jù)SQL語句將搜索到的符合條件的值取出來
            //0 代表數(shù)據(jù)庫表的第一列
            int stu_id =sqlite3_column_int(stmt, 0);
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            int age = sqlite3_column_int(stmt, 3);
            //將取出來的信息 賦值給學生的Model
            Student *stu = [[Student alloc]initWithName:name age:age gender:gender stu_ID:stu_id];
            //將學生添加到可變數(shù)組里面
            [muArray addObject:stu];
        }
        sqlite3_finalize(stmt);
        return muArray;
    }else{
        NSLog(@"查詢?nèi)渴?d",result);
    }
    sqlite3_finalize(stmt);
    return nil;
}
//根據(jù)學生的學號來進行查詢單個學生對象
-(Student *)selectStudentWithStu_ID:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *str = @"select * from Class43 where Stu_ID =?";
    int result = sqlite3_prepare_v2(db, [str UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查詢單個學生完成");
        sqlite3_bind_int(stmt, 1, stu_ID);
        Student *stu = [Student new];
        while (sqlite3_step(stmt)== SQLITE_ROW) {
            int stu_id = sqlite3_column_int(stmt, 0);
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            int age = sqlite3_column_int(stmt, 3);
            stu.Stu_ID = stu_id;
            stu.name = name;
            stu.age = age;
            stu.gender = gender;
            sqlite3_finalize(stmt);
            return stu;
        }
    }
    else{
        NSLog(@"查詢數(shù)據(jù)庫單個學生失敗%d",result);
    }
    sqlite3_finalize(stmt);
    return nil;
}
@end

下面我們在ViewController.m 中實現(xiàn)數(shù)據(jù)的 增 刪 改 查 的功能

#import "ViewController.h"
#import "Database.h"
#import "Student.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
   // [[Database sharedDataBase]openDB];
    
}

- (IBAction)add:(id)sender {
    NSLog(@"增加");
    Student *stu = [Student new];
    stu.name = @"劉高見";
    stu.gender = @"男";
    stu.Stu_ID = 1;
    stu.age = 18;
    
    Student *stu1 = [[Student alloc]initWithName:@"王" age:21 gender:@"女" stu_ID:2];
    Student *stu2 = [[Student alloc]initWithName:@"劉" age:21 gender:@"男" stu_ID:3];

    Student *stu3 = [[Student alloc]initWithName:@"趙" age:21 gender:@"女" stu_ID:4];

    Student *stu4 = [[Student alloc]initWithName:@"謝" age:21 gender:@"男" stu_ID:5];
    Database *database =[Database sharedDataBase];
    [database insertStudent:stu];
    [database insertStudent:stu1];
    [database insertStudent:stu2];
    [database insertStudent:stu3];
    [database insertStudent:stu4];
}
- (IBAction)delete:(id)sender {
//    NSLog(@"刪除");
    [[Database sharedDataBase]deleteStudent:3];
}
- (IBAction)selectAll:(id)sender {
//    NSLog(@"查詢所有");
    for (Student *stu in [[Database sharedDataBase]selectAll]) {
        NSLog(@"%@",stu);
    }
}
- (IBAction)selectSingle:(id)sender {
//    NSLog(@"查詢單個");
    Student *stu =[Student new];
    stu = [[Database sharedDataBase]selectStudentWithStu_ID:1];
    NSLog(@"%@",stu);

}
- (IBAction)updata:(id)sender {
//    NSLog(@"修改");
    Database *database = [Database sharedDataBase];
    [database updataStudentWithGender:@"女" andStu_ID:5];
    NSLog(@"%@",[[Database sharedDataBase]selectStudentWithStu_ID:5]);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

以上就是本文的全部內(nèi)容 期待大家的批評指導~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市折柠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌批狐,老刑警劉巖扇售,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嚣艇,居然都是意外死亡承冰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門食零,熙熙樓的掌柜王于貴愁眉苦臉地迎上來困乒,“玉大人,你說我怎么就攤上這事贰谣∧嚷В” “怎么了迁霎?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長百宇。 經(jīng)常有香客問我考廉,道長,這世上最難降的妖魔是什么携御? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任昌粤,我火速辦了婚禮,結(jié)果婚禮上啄刹,老公的妹妹穿的比我還像新娘涮坐。我一直安慰自己,他們只是感情好誓军,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布袱讹。 她就那樣靜靜地躺著,像睡著了一般谭企。 火紅的嫁衣襯著肌膚如雪廓译。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天债查,我揣著相機與錄音非区,去河邊找鬼。 笑死盹廷,一個胖子當著我的面吹牛征绸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俄占,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼管怠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缸榄?” 一聲冷哼從身側(cè)響起渤弛,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甚带,沒想到半個月后她肯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鹰贵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年晴氨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碉输。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡籽前,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枝哄,我是刑警寧澤肄梨,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站膘格,受9級特大地震影響峭范,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘪贱,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一纱控、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菜秦,春花似錦甜害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至主慰,卻和暖如春嚣州,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背共螺。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工该肴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藐不。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓匀哄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雏蛮。 傳聞我的和親對象是個殘疾皇子涎嚼,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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