[TwistedFate]数据库初级使用

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;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值