[TwistedFate]数据库初级使用
2015-12-08 20:25
363 查看
SQLite数据库
使用步骤:1. 引入libsqlite3.0框架
2. 在数据库操作类里 引入
创建单例类实现数据库的管理使用
// 单例的初始化方法 + (SQLiteManager *)shareManager; // 插入数据 - (void)insertTableWithStudent:(Student *)stu; // 删除数据 - (void)deleteWithAge:(NSInteger)age; // 更新 - (void)updateAge:(NSInteger)age byName:(NSString *)name; // 查询 - (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age;
方法实现
// 单例类初始化方法 + (SQLiteManager *)shareManager{ // 静态区指针 static SQLiteManager *manager = nil; if (manager == nil) { manager = [[SQLiteManager alloc] init]; // 调用创建表的方法 [manager createTable]; } // 为保证程序运行期间一直存在 所以不手动释放 // 程序运行结束 自动释放 return manager; }
创建数据库对象
// 需要在静态去定义一个指针 (让这个指针指向的对象 从程序开始到结束 一直存在) // 程序结束后被系统自动释放 static sqlite3 *db = nil;
打开数据库
// 打开数据库 - (sqlite3 *)openDatabase{ // 判断数据库是否存在 如果存在的话 直接返回 if (db != nil) { return db; } // 不存在 则创建一个并打开 // 获取Documents的路径 NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 拼接数据库文件路径 (拼接的数据的文件的名字) NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"]; NSLog(@"%@",dbPath); // 创建或者打开数据库 // 参数1 文件路径(需要把OC的字符串转化成C语言的) dbPath.UTF8String // 参数2 数据库的地址 // 接收一下返回值 判断是否打开成功 int result = sqlite3_open(dbPath.UTF8String, &db); // 用SQLITE_OK可以查表得到错误 if (result == SQLITE_OK) { NSLog(@"打开成功"); }else{ NSLog(@"打开失败"); } return db; }
关闭数据库
// 关闭数据库 - (void)closeDatabase{ int result = sqlite3_close(db); // 判断关闭是否成功 if (result == SQLITE_OK) { // 把数据库的指针 重置为空 db = nil; NSLog(@"关闭成功"); }else{ NSLog(@"关闭失败"); } }
创建表
// 创建表(要有主键值) - (void)createTable{ // 注意 一定在操作时, 先打开数据库 // 操作完毕,关闭数据 // 打开数据库 db = [self openDatabase]; // 1.写sql语句 NSString *sql = @"create table IF NOT EXISTS Student(number Integer primary key not NULL, name text not NULL, gender text not NULL, age Integer not NULL, data BLOB not NULL)"; // 2.执行sql语句 // 准备与执行的操作 int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL); if (result == SQLITE_OK) { NSLog(@"建表成功"); }else{ NSLog(@"建表失败"); } // 关闭数据库 [self closeDatabase]; }
插入数据
// 插入数据 - (void)insertTableWithStudent:(Student *)stu{ // 打开数据库 db = [self openDatabase]; // 写sql语句 NSString *sql = @"insert into Student(number, name, gender, age, data) values(?, ?, ?, ?, ?)"; // 创建一个跟随指针(指令集) sqlite3_stmt *stmt = nil; // 执行sql语句 // 预执行函数 需要用跟随指针 绑定问号 // 然后一步一步执行(判断sql语句是否正确) int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL); if (result == SQLITE_OK) { // 绑定问号(根据sql语句来决定 绑定的顺序) // 注意:绑定的顺序 从1开始 // 参数2 绑定顺序 // 参数3 绑定的值 sqlite3_bind_int(stmt, 1, (int)stu.number); // 参数4 字符串长度 一般填- 1 sqlite3_bind_text(stmt, 2, stu.name.UTF8String, - 1, NULL); sqlite3_bind_text(stmt, 3, stu.gender.UTF8String, - 1, NULL); sqlite3_bind_int(stmt, 4, (int)stu.age); // 绑定二进制数据 // [stu.data bytes] // 相当于获取到data数据的内容 // (int)stu.data.length // 相当于获取到data数据的长度 sqlite3_bind_blob(stmt, 5, [stu.data bytes], (int)stu.data.length, NULL); // 执行绑定语句 sqlite3_step(stmt); NSLog(@"插入成功"); }else{ NSLog(@"插入失败"); } // 不管插入是否成功 都要释放跟随指针 sqlite3_finalize(stmt); // 关闭数据库 [self closeDatabase]; } *****不绑定进行插入操作****** /** * 如果有data数据进行插入操作 sqlite3_exec函数 会把data数据转化成字符串存入数据库 * 也就是说你插入的数据没有data数据 直接使用sqlite3_exec这个函数进行操作 无需使用下面的函数进行绑定 * NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')"; */ //- (void)text:(Student *)stu{ // // NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')"; // // NSString *sqlNew = [NSString stringWithFormat:@"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')", stu.number, stu.name, stu.gender, stu.age]; // //}
删除数据(根据一个条件删除)
// 删除数据(根据一个条件删除) - (void)deleteWithAge:(NSInteger)age{ // 打开数据库 // db = [self openDatabase]; #pragma mark --- 不当绑定删除 需要拼接sql语句 // // 写SQL语句 // NSString *sql = @"delete from Student where age > '%ld'"; // // // 拼接sql语句 // NSString *sqlNew = [NSString stringWithFormat:@"delete from Student where age > '%ld'",age]; // // // 执行sql语句 // int result = sqlite3_exec(db, sqlNew.UTF8String, NULL, NULL, NULL); // // // 判断一下执行结果 // if (result == SQLITE_OK) { // // NSLog(@"删除成功"); // // }else{ // // NSLog(@"删除失败"); // // } // // // 关闭数据库 // [self closeDatabase]; #pragma mark --- 通过绑定删除法 // 打开数据库 db = [self openDatabase]; // 写SQL语句 NSString *sql = @"delete from Student where age > ?"; // 创建跟随指针 sqlite3_stmt *stmt = nil; // 预执行sql语句 int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL); if (result == SQLITE_OK) { // 绑定问号 sqlite3_bind_int(stmt, 1, (int)age); NSLog(@"删除成功"); }else{ NSLog(@"删除失败"); } // 执行绑定的语句 sqlite3_step(stmt); // 不管成功与否 都要释放跟随指针 sqlite3_finalize(stmt); // 关闭数据库 [self closeDatabase]; }
更新数据
// 更新数据(根据一个条件来更新) - (void)updateAge:(NSInteger)age byName:(NSString *)name{ // 打开数据库 db = [self openDatabase]; // 写sql语句 NSString *sql = [NSString stringWithFormat:@"update Student set age = '%ld' where name = '%@'", age, name]; // 执行sql语句 int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL); if (result == SQLITE_OK) { NSLog(@"更新成功"); }else{ NSLog(@"更新失败"); } // 关闭数据库 [self closeDatabase]; }
根据条件查询数据
// 根据条件查询数据 - (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age{ // 打开数据库 db = [self openDatabase]; // 写sql语句 NSString *sql = @"select * from Student where name = ? and age = ?"; // 创建跟随指针 sqlite3_stmt *stmt = nil; // 创建一个对象 Student *stu = [[Student alloc] init]; // 预执行sql语句 int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL); if (result == SQLITE_OK) { // 绑定问号 sqlite3_bind_text(stmt, 1, name.UTF8String, - 1, NULL); sqlite3_bind_int(stmt, 2, (int)age); // 查询时 如果下一行准备好了 返回 SQLITE_ROW // 这时可以继续查询 // int iCol列数 // 如果你是查询所有的字段的话 那个这个列表 就根据你创建的建表的顺序一样 // 注意:从0开始 // 如果你查询的是特定的字段 那么这个列数就要根据你的sql语句来写 // 也是从0开始 while (sqlite3_step(stmt) == SQLITE_ROW) { // 读取数据 int number = sqlite3_column_int(stmt, 0); char *name = (char *)sqlite3_column_text(stmt, 1); char *gender = (char *)sqlite3_column_text(stmt, 2); int age = sqlite3_column_int(stmt, 3); // 读取二进制数据 NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)]; // 赋值model // stringWithUTF8String 把C语言字符串转化成OC字符串 stu.name = [NSString stringWithUTF8String:name]; stu.gender = [NSString stringWithUTF8String:gender]; stu.number = number; stu.age = age; stu.data = data; } NSLog(@"查询成功"); }else{ NSLog(@"查询失败"); } // 执行sql语句 sqlite3_step(stmt); // 释放跟随指针 sqlite3_finalize(stmt); // 关闭数据库 [self closeDatabase]; // 自动释放 对象 return [stu autorelease]; }
查询所有行(返回一个数组)
// 查询所有行(返回一个数组) - (NSArray *)selectAllRows{ // 打开数据库 [self openDatabase]; // 写sql语句 NSString *sql = @"select * from Student"; // 创建一个可变数组备用 NSMutableArray *array = [NSMutableArray array]; // 创建跟随指针 sqlite3_stmt *stmt = nil; // 预执行 int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL); // 创建一个对象 Student *stu = [[Student alloc] init]; if (result == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) { // 从数据库中读取数据 int number = sqlite3_column_int(stmt, 0); char *name = (char *)sqlite3_column_text(stmt, 1); char *gender = (char *)sqlite3_column_text(stmt, 2); int age = sqlite3_column_int(stmt, 3); // 读取二进制数据 NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)]; // 赋值model stu.name = [NSString stringWithUTF8String:name]; stu.gender = [NSString stringWithUTF8String:gender]; stu.number = number; stu.age = age; stu.data = data; // 添加到数组 [array addObject:stu]; [stu release]; } NSLog(@"成功"); }else{ NSLog(@"失败"); } // 释放跟随指针 sqlite3_finalize(stmt); // 关闭数据库 [self closeDatabase]; return array; }
相关文章推荐
- Sqlite3
- Mac平台重新设置MySQL的root密码
- 更改oracle字符集
- Sqlite官方下载对应版本注意细节
- icare3.0运维中数据库使用的注意事项----------运维日志11
- 动态sql例子
- express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(一)
- SqlMapConfig.xml中的setting属性设置
- Oracle数据库学习<一>
- mysql语法替换字符串
- 我心中的MySQL DBA (转载)
- 学习MongoDB(一) 如何在Linxu安装与启动
- MySQL主从配置完整步骤资料
- mysql游标批量操作
- redis 数据类型详解 以及 redis适用场景场合
- 20151208 再次搭建Oracle11g环境 ocp 047 20-40
- Spotlight on MySQL监控MySQL服务器
- SQL的四种连接-左外连接、右外连接、内连接、全连接
- Redis学习笔记---字典类型
- iOS之SQL语句详解