美文网首页M_iOSiOS开发iOS学习笔记
iOS基础--数据库操作的简单封装

iOS基础--数据库操作的简单封装

作者: 李xiao屁的忧伤 | 来源:发表于2015-12-24 12:55 被阅读343次

    沙盒路径的简单封装.m

    #import "SandBoxPaths.h"
    
    @implementation SandBoxPaths
    
    // 得到沙盒主目录
    + (NSString *)homePath
    {
        return NSHomeDirectory() ;
    }
    
    // 得到documents文件夹目录
    + (NSString *)documentPath
    {
        return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject  ;
    }
    
    // 得到document文件夹下的指定文件的路径
    + (NSString *)documentAbsolutePath : (NSString *)fileName
    {
        return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:fileName] ;
    }
    
    // 得到library文件夹目录
    + (NSString *)libraryPath
    {
        return NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject ;
    }
    
    
    // 得到Cache文件夹目录
    + (NSString *)cachePath
    {
        return NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject ;
    }
    
    // 得到temp文件夹目录
    + (NSString *)tempPath
    {
        return NSTemporaryDirectory() ;
    }
    
    @end
    

    数据库操作.m

    #import "DataBaseHelper.h"
    #import "SandBoxPaths.h"
    
    @interface DataBaseHelper ()
    
    @property (nonatomic,retain)NSString *fileName ; // 数据库文件名称
    
    @end
    
    @implementation DataBaseHelper
    
    // 将该类封装成单例类
    static DataBaseHelper *dataBaseHelper = nil ;
    + (DataBaseHelper *)sharedDataBaseHelper
    {
        @synchronized(self)
        {
            if (dataBaseHelper == nil)
            {
                dataBaseHelper = [[DataBaseHelper alloc] init] ;
            }
            
        }
        return dataBaseHelper ;
    }
    
    // 创建数据库文件路径
    - (void)dataBaseFilePathWithFileName : (NSString *)fileName
    {
        // 首先得到沙盒的document路径 再与文件名进行拼接
        // 看文件名是否带后缀.sqlite , 如果有直接使用,如果没有内部为他拼接
        if (![fileName containsString:@".sqlite"])
        {
            fileName = [fileName stringByAppendingString:@".sqlite"] ;
        }
        self.fileName = [[SandBoxPaths documentPath] stringByAppendingPathComponent:fileName] ;
    }
    
    // 打开(数据库存在)或创建数据库(数据库不存在)
    - (sqlite3 *)openOrCreatDataBase
    {
        // 指向数据库的空指针
        sqlite3 *sqlDataBase = NULL ;
        // 打开数据库
        int result = sqlite3_open(self.fileName.UTF8String, &sqlDataBase) ;
        if (result == SQLITE_OK)
        {
            return sqlDataBase ;
        }
        else
        {
            return NULL ;
        }
    }
    
    
    // 除了查询操作,其他操作(增,删,改)所执行的方法
    - (BOOL)execSQLWithSqlString : (NSString *)sqlString
    {
        sqlite3 *sqlDataBase = [self openOrCreatDataBase] ;
        int result = sqlite3_exec(sqlDataBase, sqlString.UTF8String, NULL, NULL, NULL) ;
        if (result == SQLITE_OK)
        {
            sqlite3_close(sqlDataBase) ;
            return YES ;
        }
        else
        {
            NSLog(@"执行操作失败---%d",result) ;
            sqlite3_close(sqlDataBase) ;
            return NO ;
        }
    }
    
    // 数据库查询,通用
    - (NSArray *)queryDataWithSqlString : (NSString *)sqlString
    {
        // 打开数据库
        sqlite3 *sqlDataBase = [self openOrCreatDataBase] ;
        // 初始化可变数组用来承接所有记录
        NSMutableArray *resultArray = [[NSMutableArray alloc] init] ;
        // 声明stmt指针,一会儿用来盛放每条记录
        sqlite3_stmt *stament = NULL ;
        // 编译并检查SQL语句是否正确,并放在stament指针中
        int result = sqlite3_prepare(sqlDataBase, sqlString.UTF8String, -1, &stament, NULL) ;
        if (result == SQLITE_OK)
        {
            while (sqlite3_step(stament) == SQLITE_ROW)
            {
                // 每执行一次step函数,stament中就会完整的保存一条记录
                // 确定该表有几个字段,也就是有几列
                int columnCount = sqlite3_column_count(stament) ;
                // 创建一个可变字典
                NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary] ;
                // 遍历所有的列
                for (int i = 0; i < columnCount; i++)
                {
                    // 得到某一列的数据类型
                    int type = sqlite3_column_type(stament, i) ;
                    // 得到字段名称
                    const char *attributeName = sqlite3_column_name(stament, i) ;
                    NSString *keyString = [NSString stringWithCString:attributeName encoding:NSUTF8StringEncoding] ;
                    switch (type)
                    {
                        case SQLITE_INTEGER:
                        {
                            // 整型
                            int value = sqlite3_column_int(stament, i) ;
                            [mutableDictionary setObject:[NSNumber numberWithInt:value] forKey:keyString] ;
                        }
                            break;
                        case SQLITE_TEXT:
                        {
                            // 字符串
                            const unsigned char *value = sqlite3_column_text(stament, i) ;
                            NSString *valueString = [NSString stringWithCString:(const char *)value encoding:NSUTF8StringEncoding] ;
                            [mutableDictionary setObject:valueString forKey:keyString] ;
                        }
                            break ;
                        case SQLITE_FLOAT:
                        {
                            // 浮点型
                            double value = sqlite3_column_double(stament, i) ;
                            [mutableDictionary setObject:[NSNumber numberWithDouble:value] forKey:keyString] ;
                        }
                            break ;
                            
                        default:
                            break;
                    }
                }
                 [resultArray addObject:mutableDictionary] ;
            }
        }
        // 关闭数据库
        sqlite3_close(sqlDataBase) ;
        // 释放stament所持有的资源
        sqlite3_finalize(stament) ;
        return resultArray ;
    }
    

    相关文章

      网友评论

        本文标题:iOS基础--数据库操作的简单封装

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