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
    原文作者:面糊
    原文地址: https://www.jianshu.com/p/5b2fcc4fea02
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞