iOS數(shù)據(jù)庫(kù)SQLite操作詳解

  • 須知: (1)歸檔(2)偏好設(shè)置(3)Plist存儲(chǔ):都不適合處理大批量數(shù)據(jù)的存儲(chǔ),大批量數(shù)據(jù)通常使用數(shù)據(jù)庫(kù)來(lái)進(jìn)行存儲(chǔ);
  • 對(duì)數(shù)據(jù)庫(kù)的操作:通常情況下是啟動(dòng)程序立即打開(kāi)數(shù)據(jù)庫(kù),所以在AppDelegate.m文件didFinishLaunchingWithOptions方法中打開(kāi)數(shù)據(jù)庫(kù)(如果沒(méi)有則先創(chuàng)建,再打開(kāi))
  • 數(shù)據(jù)庫(kù)的操作應(yīng)該封裝成工具類,在這個(gè)工具類里面對(duì)外提供接口,方便外界的CRUD操作;
  • 封裝的這個(gè)工具類,設(shè)計(jì)成單例,非絕對(duì)的單例
  • 使用sqlite3,應(yīng)該手動(dòng)導(dǎo)入這個(gè)框架
  • 具體步奏如下
    • 1.創(chuàng)建表
    • 2.執(zhí)行sql語(yǔ)句
    • 3.查看的所有數(shù)據(jù)

1.單例設(shè)計(jì)

+ (instancetype)shareIntance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

2.定義一個(gè)數(shù)據(jù)庫(kù)對(duì)象,注意用assign修飾

@interface SQLiteManager ()
@property (nonatomic, assign) sqlite3 *db;
@end

3.打開(kāi)數(shù)據(jù)庫(kù)方法

- (BOOL)openDB
{
    // 數(shù)據(jù)庫(kù)文件存放的路徑(沙盒中)
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
   // 全路徑
    filePath = [filePath stringByAppendingPathComponent:@"demo.sqlite"];

    // 1> 參數(shù)一:文件路徑+文件名字
    // 2> 參數(shù)二:數(shù)據(jù)庫(kù)對(duì)象
    if (sqlite3_open(filePath.UTF8String, &_db) != SQLITE_OK) {
        NSLog(@"數(shù)據(jù)庫(kù)打開(kāi)失敗");
        return NO;
    }
    // 創(chuàng)建表
    return [self createTable];
}

4.創(chuàng)建表的方法

- (BOOL)createTable
{
    // 1.封裝創(chuàng)建表的語(yǔ)句-->注意標(biāo)點(diǎn)符號(hào)分號(hào),要包括在內(nèi)
    NSString *createTableSQL = @"CREATE TABLE IF NOT EXISTS 't_student' ( 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);";
    
    // 2.執(zhí)行sql語(yǔ)句
    return [self execSQL:createTableSQL];
}

5.執(zhí)行sql語(yǔ)句的方法

- (BOOL)execSQL:(NSString *)sql
{
    // 1> 參數(shù)一:數(shù)據(jù)庫(kù)對(duì)象
    // 2> 參數(shù)二:要執(zhí)行的sql語(yǔ)句
    return sqlite3_exec(self.db, sql.UTF8String, nil, nil, nil) == SQLITE_OK;
}

6.返回要查看的所有數(shù)據(jù)的數(shù)組

- (NSArray *)querySQL:(NSString *)querySQL
{
    // 定義游標(biāo)對(duì)象
    sqlite3_stmt *stmt = nil;
    
    // 準(zhǔn)備查詢
    // 1> 參數(shù)一:數(shù)據(jù)庫(kù)對(duì)象
    // 2> 參數(shù)二:查詢語(yǔ)句
    // 3> 參數(shù)三:查詢語(yǔ)句的長(zhǎng)度:-1
    // 4> 參數(shù)四:句柄(游標(biāo)對(duì)象)
    if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
        NSLog(@"準(zhǔn)備查詢失敗");
        return nil;
    };
    
    // 準(zhǔn)備成功,開(kāi)始查詢數(shù)據(jù)
    NSMutableArray *dictArray = [NSMutableArray array];
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        // 獲取一共多少列
        int count = sqlite3_column_count(stmt);
        
        // 定義字典
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        for (int i = 0; i < count; i++) {
            // 取出i位置列的字段名,作為字典的鍵
            const char *cKey = sqlite3_column_name(stmt, i);
            NSString *key = [NSString stringWithUTF8String:cKey];
            
            // 取出i位置的存儲(chǔ)的值,作為字典的值
            const char *cValue = (const char *)sqlite3_column_text(stmt, i);
            NSString *value = [NSString stringWithUTF8String:cValue];
            
            // 將鍵值對(duì)一個(gè)一個(gè)放入字典中
            [dict setValue:value forKey:key];
        }
        
        // 將獲取的字典放入數(shù)組中
        [dictArray addObject:dict];
    }
    
    // 返回取出所有數(shù)據(jù)的數(shù)組
    return dictArray;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末飒责,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趾牧,更是在濱河造成了極大的恐慌,老刑警劉巖肯污,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘单,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仇箱,警方通過(guò)查閱死者的電腦和手機(jī)县恕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剂桥,“玉大人忠烛,你說(shuō)我怎么就攤上這事∪ǘ海” “怎么了美尸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)斟薇。 經(jīng)常有香客問(wèn)我师坎,道長(zhǎng),這世上最難降的妖魔是什么堪滨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任胯陋,我火速辦了婚禮,結(jié)果婚禮上袱箱,老公的妹妹穿的比我還像新娘遏乔。我一直安慰自己,他們只是感情好发笔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盟萨。 她就那樣靜靜地躺著,像睡著了一般了讨。 火紅的嫁衣襯著肌膚如雪捻激。 梳的紋絲不亂的頭發(fā)上制轰,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音胞谭,去河邊找鬼垃杖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丈屹,可吹牛的內(nèi)容都是我干的缩滨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泉瞻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苞冯?” 一聲冷哼從身側(cè)響起袖牙,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舅锄,沒(méi)想到半個(gè)月后鞭达,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皇忿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年畴蹭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍烁。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叨襟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔荒,到底是詐尸還是另有隱情糊闽,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布爹梁,位于F島的核電站右犹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姚垃。R本人自食惡果不足惜念链,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望积糯。 院中可真熱鬧掂墓,春花似錦、人聲如沸絮宁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绍昂。三九已至啦粹,卻和暖如春偿荷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唠椭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工跳纳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贪嫂。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓旬陡,卻偏偏與公主長(zhǎng)得像钓瞭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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