代码实现SQLite-DDL语句
-
使用数据库前的准备
- 导入数据库的类库
- 项目工程文件 -> TARGET -> Linked Frameworks and Libraies -> 添加libsqlite3.0.tbd
- 在需要使用数据库的类中, 引入数据库的头文件:
@import <sqlite3.0.h>
- 导入数据库的类库
-
创建并打开数据库
-
首先, 要创建一个字符串路径, 用于存放数据库的位置以及名称
- 注意这里的字符串需要使用
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(@"数据库打开成功"); }
-
-
为数据库创建一个表
-
数据库的操作, 就需要使用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(@"创建表成功"); }
-
-
下面是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(@"修改成功"); } }
-
总结
- 首先, 要使用sqlite3数据库, 就需要导入指定的类库, 在XCode7.0之后, 类库的名称已经改为
libsqlite3.0.tbd
- 其次, 注意每次打开数据库, 都要在当前的控制器, 使用sqlite3指针, 引用住已经打开的数据库, 如果这个指针被释放, 后续的数据库操作就会失败
- 千万注意: SQL语句必须是UTF8String, 并且一定要注意书写, 任何一点小错误都会导致你的数据库操作失败
- 首先, 要使用sqlite3数据库, 就需要导入指定的类库, 在XCode7.0之后, 类库的名称已经改为
-
补充, 关于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