美文网首页
12、简单数据库的封装

12、简单数据库的封装

作者: 深爱久随i | 来源:发表于2017-01-20 11:11 被阅读0次
    #import "DataBaseHelper.h"
    #import <sqlite3.h>
    
    @interface DataBaseHelper (){
        sqlite3* sqliteHandle;
    }
    @property(nonatomic,retain)NSString* dbFileName;//数据库文件路径
    @end
    
    @implementation DataBaseHelper
    
    +(DataBaseHelper*)sharedDataBaseHelper{
        static DataBaseHelper* dbHelper=nil;
        if (dbHelper==nil) {
            dbHelper=[[DataBaseHelper alloc] init];
        }
        return dbHelper;
    }
    
    //创建数据库文件存储的路径,一般在documents和library/caches
    
    -(void)dbFileNameWithName:(NSString*)fileName{
        //将fileName中的空格替换掉
        fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
        
        //判断用户传递进来的文件名是否为nil或者为空字符串
        if (fileName) {
            //判断文件名是否为空字符串
            if (fileName.length == 0) {
                //空字符串@""
                 NSLog(@"数据库文件无名称,当程序关闭的时候,数据库文件也会销毁");
            }else{
                //判断文件名是否带后缀名,如果有就直接使用,如果没有,就添加后缀名之后在使用
                if (![fileName hasSuffix:@".sqlite"]) {
                    //如果没有后缀名,添加后缀名之后在使用
                    fileName = [fileName stringByAppendingString:@".sqlite"];
                }
                
            }
        }else{
            //说明文件名为nil
            NSLog(@"数据库文件无名称,当程序关闭的时候,数据库文件也会销毁");
            fileName=@"";
        }
        //将文件名称拼接成有效的文件路径
        NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        fileName=[docPath stringByAppendingPathComponent:fileName];
        //将处理好的文件名赋值给属性,让其他方法使用
        self.dbFileName=fileName;
        
    }
    
    //打开或者创建数据库文件
    -(sqlite3*)creatDB{
        int result=sqlite3_open(self.dbFileName.UTF8String, &sqliteHandle);
        if (result==SQLITE_OK) {
             NSLog(@"创建或者打开数据库成功");
            return sqliteHandle;
        }else{
            NSLog(@"创建或者打开数据库失败----%d",result);
            return NULL;
        }
        
    }
    
    //无返回结果集执行的方法
    -(BOOL)noQueryWithSql:(NSString*)sql{
        //执行任何数据库操作之前,先打开数据库;操作执行完毕之后记得关闭数据库
        sqlite3* sqlite=[self creatDB];
        //执行sql语句
        if (sqlite) {//保证数据库打开成功
            int result=sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
            //当操作有结果的时候一定要关闭数据库
            sqlite3_close(sqlite);
            if (result==SQLITE_OK) {
                NSLog(@"执行非查询操作成功");
                return YES;
            }else{
                NSLog(@"执行非查询操作失败-----%d",result);
                return NO;
            }
        }
        //说明数据库打开失败
        NSLog(@"执行查询操作的时候,打开数据库失败了");
        return NO;
       
       
    }
    
    //通用查询方法
    -(NSArray*)queryWithSql:(NSString*)sql{
        //打开数据库
        sqlite3* sqlite=[self creatDB];
        //创建可变数组,用来存放所有的记录
        NSMutableArray* resultMArray=[[NSMutableArray alloc] init];
        //声明伴随指针,用来存放所有的记录
        sqlite3_stmt* stmt=NULL;
        //预执行
        int result=sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
        if (result==SQLITE_OK) {
            //说明sql语句没有问题
            NSLog(@"执行查询操作成功");
            //从伴随指针中取出每一条记录
            while (sqlite3_step(stmt)==SQLITE_ROW) {
                //每执行一次循环体,就取出一条记录
                NSMutableDictionary* mDic=[[NSMutableDictionary alloc] init];
                //确定改条记录有几个字段
                int sumColumn=sqlite3_column_count(stmt);
                //for循环遍历一条记录中的所有字段
                for (int i=0; i<sumColumn; i++) {
                    //获取当前列的数据类型
                   int type = sqlite3_column_type(stmt, i);
                    //获取字段名
                   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);
                            //为字典赋值
                            [mDic setObject:@(value) forKey:key];
                            
                        }
                     
                            break;
                        case SQLITE_TEXT:{
                            //字符串类型
                           const unsigned char* value=sqlite3_column_text(stmt, i);
                            NSString* valueStr=[NSString stringWithCString:( const char *)value encoding:NSUTF8StringEncoding];
                            [mDic setObject:valueStr forKey:key];
                            
                        }
                            break;
                            
                        default:
                            break;
                    }
                }
                
              //一次for循环结束,一条记录才转换为一个字典
                [resultMArray addObject:mDic];
               
            }
            
        }else{
             //说明sql语句有问题
            NSLog(@"执行查询操作失败-----%d",result);
           
        }
        
        //将伴随指针所持有的资源释放掉,关闭数据库
        sqlite3_finalize(stmt);
        sqlite3_close(sqlite);
        //while循环结束,说明所有的记录都已经获取完整
        return resultMArray;
        
    }
    
    @end
    
    

    以上方法均在.h中声明即可

    相关文章

      网友评论

          本文标题:12、简单数据库的封装

          本文链接:https://www.haomeiwen.com/subject/espwbttx.html