6. 代码实现SQLite-DDL语句

代码实现SQLite-DDL语句

  1. 使用数据库前的准备

    • 导入数据库的类库
      • 项目工程文件 -> TARGET -> Linked Frameworks and Libraies -> 添加libsqlite3.0.tbd
    • 在需要使用数据库的类中, 引入数据库的头文件: @import <sqlite3.0.h>
  2. 创建并打开数据库

    • 首先, 要创建一个字符串路径, 用于存放数据库的位置以及名称

      • 注意这里的字符串需要使用UTF8String, 因此在使用的时候要进行转码
    • 创建一个全局性的数据库引用指针, 他保证能够全局的操作这个已经打开了的数据库

      • 并且, 在其他方法中要继续操作这个数据库的话, 也要使用这个指针: sqlite3 *db
    • 代码以及解释如下:

        // 1. 创建并且打开一个数据库
        // 1.1 根据路径打开一个数据库, 如果数据库打开不成功的话, 就创建一个数据库
        // 1.2 这里要注意一点, 数据库的名称一般规范为sqlite
        NSString *path = @"/Users/fanghe/Desktop/数据库/demo.sqlite";
        
        /**
         *  打开一个数据库
         *  filename  数据库的文件路径, 这里需要传入UTF8字符串, 所以要强制转化一下
         *  ppDb  一个已经打开的数据库, 他是一个地址引用, 如果要在后续继续使用这个数据库的话, 就需要操作这个引用
         */
        if (sqlite3_open(path.UTF8String, &db) != SQLITE_OK) {
            NSLog(@"数据库打开失败");
            return;
        } else {
            NSLog(@"数据库打开成功");
        }
      
  3. 为数据库创建一个表

    • 数据库的操作, 就需要使用SQL语句, 在OC中, 使用SQL语句表现为:

      • 直接使用NSString编写SQL语句, 但是注意在使用的时候, 转化为UTF8String
      • 一定要注意书写的格式, 在这里笔者建议大家先在Navicat上编写好语句, 然后复制过来, 否则任何一点小错误, 都会导致你的操作失败
    • 数据库的执行函数, 以及具体实现代码如下:

        // 1. 编写sql语句的字符串
        NSString *sql = @"create table if not exists T_human(id integer primary key autoincrement, name text not null, age integer default 18, score real default 60.0)";
        
        // 2. 执行sql语句
        /**
         *  sql执行语句
         *
         *  @param sqlite3 *     已经打开的数据库引用
         *  @param sql#>         sql语句
         *  @param callback      回调的代码块
         *  @param void *        回调代码块中的参数1, 传入nil即可
         *  @param char **errmsg 错误信息
         */
        if (sqlite3_exec(db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
            NSLog(@"创建表失败");
            return;
        } else {
            NSLog(@"创建表成功");
        }
      
  4. 下面是DDL的drop语句以及alert语句

     - (IBAction)dropTable:(id)sender {
         
         // 1. sql语句
         NSString *sql = @"drop table if exists T_human";
         
         // 2. 执行sql语句
         if (sqlite3_exec(db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
             NSLog(@"删除失败");
             return;
         } else {
             NSLog(@"删除成功");
         }
     }
     
     - (IBAction)alertTable:(id)sender {
         
         // 1. sql语句
         NSString *sql = @"alter table T_human add column address text";
         
         // 2. 执行
         if (sqlite3_exec(db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
             NSLog(@"修改失败");
             return;
         } else {
             NSLog(@"修改成功");
         }
     }
    
  5. 总结

    • 首先, 要使用sqlite3数据库, 就需要导入指定的类库, 在XCode7.0之后, 类库的名称已经改为libsqlite3.0.tbd
    • 其次, 注意每次打开数据库, 都要在当前的控制器, 使用sqlite3指针, 引用住已经打开的数据库, 如果这个指针被释放, 后续的数据库操作就会失败
    • 千万注意: SQL语句必须是UTF8String, 并且一定要注意书写, 任何一点小错误都会导致你的数据库操作失败
  6. 补充, 关于DDL语句工具类的封装

     #import "SQLiteTool.h"
     #import <sqlite3.h>
     
     @interface SQLiteTool ()
     @property (nonatomic, assign) sqlite3 *db;
     @end
     
     static SQLiteTool *_instance;
     
     @implementation SQLiteTool
     
     + (instancetype)shareInstance {
         static dispatch_once_t onceToken;
         dispatch_once(&onceToken, ^{
             _instance = [[SQLiteTool alloc] init];
             [_instance openDataBase];
         });
         
         return _instance;
     }
     
     // 打开数据库
     - (void)openDataBase {
     
         NSString *path = @"/Users/fanghe/Desktop/数据库/demo.sqlite";
     
         if (sqlite3_open(path.UTF8String, &_db) != SQLITE_OK) {
             NSLog(@"数据库打开失败");
             return;
         } else {
             NSLog(@"数据库打开成功");
         }
     }
     
     // 创建表格
     - (void)createTableWithName:(NSString *)name {
         
         // 1. 由外界传入的创建表格sql语句
         NSString *sql = name;
         
         // 2. 执行sql语句
         if (sqlite3_exec(_db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
             NSLog(@"创建表失败");
             return;
         } else {
             NSLog(@"创建表成功");
         }
     }
     
     // 删除表格
     - (void)dropTableWithName:(NSString *)name {
         
         // 1. sql语句
         NSString *sql = [NSString stringWithFormat:@"drop table if exists %@", name];
         
         // 2. 执行sql语句
         if (sqlite3_exec(_db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
             NSLog(@"删除失败");
             return;
         } else {
             NSLog(@"删除成功");
         }
     }
     
     // 修改表格
     - (void)alertTableWithName:(NSString *)name {
         
         // 1. sql语句
         NSString *sql = [NSString stringWithFormat:@"alter table %@ add column address text", name];
         
         // 2. 执行
         if (sqlite3_exec(_db, sql.UTF8String, nil, nil, nil) != SQLITE_OK) {
             NSLog(@"修改失败");
             return;
         } else {
             NSLog(@"修改成功");
         }
     }
     
     @end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容