iOS數(shù)據(jù)庫封裝

新建一個繼承與NSObject的類葡兑,在延展中聲明一個字符串類型的屬性用來存儲數(shù)據(jù)庫文件路徑奖蔓。

@property(nonatomic,strong)NSString* dbFileName;//數(shù)據(jù)庫文件路徑

給這個類添加一個單例的方法,保持該類對象的唯一

//單例方法
+ (DatabaseHelper*)shareDataBaseHelper{
  
  static DatabaseHelper* dbHelper = nil;
  if (dbHelper == nil) {
      dbHelper = [[DatabaseHelper alloc] init];
  }
  return dbHelper;
}

創(chuàng)建數(shù)據(jù)庫文件存儲的路徑讹堤,一般在Documents或者Library/Caches

- (void)dbFileNameWithName:(NSString *)fileName{
  //將fileName中的空格干掉
  fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
  
  
  //判斷用戶傳遞進(jìn)來的文件名是否為nil
  if (fileName) {
      //判斷文件名是否為空字符串
      if (fileName.length == 0) {
          //空字符串@“”
          NSLog(@"數(shù)據(jù)庫文件無名稱锭硼,當(dāng)程序關(guān)閉的時(shí)候,數(shù)據(jù)庫文件也會銷毀");
      }else{
          //判斷文件名是否帶后綴名蜕劝,如果有直接使用檀头,如果沒有后綴名,添加后綴名之后在使用
          if (![fileName hasSuffix:@".sqlite"]) {
              //如果沒有后綴名岖沛,先添加在使用
              [fileName stringByAppendingString:@".sqlite"];
          }
      }
  }else{
      //說明文件名為nil
      NSLog(@"數(shù)據(jù)庫文件無名稱暑始,當(dāng)程序關(guān)閉的時(shí)候,數(shù)據(jù)庫文件也會銷毀");
      fileName = @"";
  }
  //將文件名稱拼接成有效的文件路徑
  NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
  
  //將處理好的文件名賦值給屬性婴削,讓其他方法使用
   self.dbFileName = [documentsPath stringByAppendingPathComponent:fileName];
}

打開或創(chuàng)建數(shù)據(jù)庫

//打開或者創(chuàng)建數(shù)據(jù)庫
- (sqlite3 *)openOrCreateDB{

  sqlite3 *sqlite = nil;
 int result = sqlite3_open(self.dbFileName.UTF8String, &sqlite);
  if (result == SQLITE_OK) {
      NSLog(@"數(shù)據(jù)庫打開成功");
      return sqlite;
  }else{
      NSLog(@"數(shù)據(jù)庫打開失敗-----%d",result);
      return NULL;
  }
}

無返回集的操作方法(非查詢方法)

//無返回集執(zhí)行的方法
- (BOOL)noQueryWithSql:(NSString *)sql{
  
  //執(zhí)行任何操作之前先打開數(shù)據(jù)庫廊镜,操作執(zhí)行完畢之后,關(guān)閉數(shù)據(jù)庫
  
  sqlite3 *sqlite = [self openOrCreateDB];
  //執(zhí)行sql語句
  //保證數(shù)據(jù)庫打開成功
  if (sqlite) {
      
    int result = sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
      //當(dāng)操作有結(jié)果的時(shí)候唉俗,要關(guān)閉數(shù)據(jù)庫
      sqlite3_close(sqlite);

      if (result == SQLITE_OK) {
          NSLog(@"執(zhí)行非查詢操作成功");
          return YES;
      }else{
          NSLog(@"執(zhí)行非查詢操作失敗-----%d",result);
          return NO;
      }
  }else{
      NSLog(@"執(zhí)行非查詢操作時(shí)打開數(shù)據(jù)庫失敗");
      return NO;
  }
}

通用的查詢方法

//通用查詢的方法
- (NSMutableArray*)queryWithSql:(NSString *)sql{
  
  //創(chuàng)建可變數(shù)組嗤朴,用來存放所有的記錄
  NSMutableArray* resultMArray = [[NSMutableArray alloc] init];
  
  //打開數(shù)據(jù)庫
  sqlite3 *sqlite = [self openOrCreateDB];
  
  //聲明伴隨指針,用來存放所有的記錄
  sqlite3_stmt *stmt = nil;
  
 int result = sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
  
  if (result == SQLITE_OK) {
      //說明sql語句沒有問題
      
      //從伴隨指針中遍歷取出每一條記錄
      while (sqlite3_step(stmt) == SQLITE_ROW) {
          //沒執(zhí)行一次循環(huán)體虫溜,就取出一條記錄
          NSMutableDictionary* rowMDic = [[NSMutableDictionary alloc] init];
          //確定該條記錄有幾個字段
          int sumColumn = sqlite3_column_count(stmt);
          //for循環(huán)遍歷一條記錄中的所有字段雹姊,給字典賦值
          for (int i = 0; i < sumColumn; i++) {
              //獲取當(dāng)前列的數(shù)據(jù)類型
           int type =  sqlite3_column_type(stmt, i);
              //獲取當(dāng)前列的字段名
          const char* name = sqlite3_column_name(stmt, i);
              
      NSString* key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
              
              switch (type) {
                  case SQLITE_INTEGER:
                      //int型
                  {
                      //取值
              int value =  sqlite3_column_int(stmt, i);
                      //賦值
              [rowMDic setObject:@(value) forKey:key];
                  }
                      
                      break;
                      
                  case SQLITE_TEXT:
                   //字符串類型
                      
                  {
              //取值
      const unsigned char *value = sqlite3_column_text(stmt, i);
                      
      NSString* stringValue = [NSString stringWithCString:(const char*)(value) encoding:NSUTF8StringEncoding];
              //賦值
              [rowMDic setObject:stringValue forKey:key];
                  }
                      break;
                    //若需要獲取更多類型的表信息,則可以添加對應(yīng)的case分支  
                  default:
                      break;
              }
             
          }
          //for循環(huán)結(jié)束后把字典添加到數(shù)組中
          [resultMArray addObject:rowMDic];
      }
      //while循環(huán)結(jié)束衡楞,所有的記錄都已經(jīng)獲取完成
  }else{
      //說明sql語句有問題
   NSLog(@"執(zhí)行查詢操作失敗-----%d",result); 
  }
  //釋放資源
  if (stmt != nil) {
      sqlite3_finalize(stmt);
  }
  //關(guān)閉數(shù)據(jù)庫
  sqlite3_close(sqlite);
  //返回
  return resultMArray;
}

最后吱雏,在(頭文件中).h中暴露相應(yīng)的方法給外部調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子歧杏,更是在濱河造成了極大的恐慌镰惦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬绒,死亡現(xiàn)場離奇詭異旺入,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凯力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門眨业,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沮协,你說我怎么就攤上這事龄捡。” “怎么了慷暂?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵聘殖,是天一觀的道長。 經(jīng)常有香客問我行瑞,道長奸腺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任血久,我火速辦了婚禮突照,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氧吐。我一直安慰自己讹蘑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布筑舅。 她就那樣靜靜地躺著座慰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翠拣。 梳的紋絲不亂的頭發(fā)上版仔,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音误墓,去河邊找鬼蛮粮。 笑死,一個胖子當(dāng)著我的面吹牛谜慌,可吹牛的內(nèi)容都是我干的然想。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼畦娄,長吁一口氣:“原來是場噩夢啊……” “哼又沾!你這毒婦竟也來了弊仪?” 一聲冷哼從身側(cè)響起熙卡,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤杖刷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驳癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑燃,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年颓鲜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了表窘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜滨,死狀恐怖乐严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衣摩,我是刑警寧澤昂验,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站艾扮,受9級特大地震影響既琴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泡嘴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一甫恩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酌予,春花似錦磺箕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莱褒,卻和暖如春击困,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广凸。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工阅茶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谅海。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓脸哀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扭吁。 傳聞我的和親對象是個殘疾皇子撞蜂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盲镶,服務(wù)發(fā)現(xiàn),斷路器蝌诡,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 沙盒 Plist Preference偏好設(shè)置 NSKeyedArchiver歸檔 / NSKeyedUnarch...
    追風(fēng)者366閱讀 3,324評論 0 6
  • 我今天全單7天結(jié)束了準(zhǔn)備今天復(fù)食溉贿,我從今年正月十五過后開始使用汁法,一直堅(jiān)持半單浦旱,到現(xiàn)在一共全單過4次宇色,第一次5天...
    五盛緣老爹排毒養(yǎng)生閱讀 269評論 0 0
  • 武漢的。求建議 最好有經(jīng)驗(yàn)的 鳳凰篝火晚會之類的怎么樣??
    七屆書生閱讀 120評論 0 1