• iOS数据持久化(二)SQLite


    一、什么是SQLite

      SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,处理速度快,非常适合用于移动端开发。
    二、使用
      创建DataBaseHandle.h   &    DataBaseHandle.m
      
    DataBaseHandle.h
    #import <Foundation/Foundation.h>
    #import "Student.h"
    @interface DataBaseHandle : NSObject
    + (DataBaseHandle *)shareDataBase;
    - (void)openDB;
    - (void)closeDB;
    //添加数据
    - (void)insertNewStudent:(Student *)student;
    /**
     *  根据学号查询学生
     */
    - (Student *)selectStudentWithNumber:(NSInteger)number;
    /**
     *  查询表中所有数据
     */
    - (NSMutableArray *)selectAllStudents;
    /**
     *  根据学号删除
     */
    - (void)deleteStudentWithNumber:(NSInteger)number;
    - (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number;
    @end
    

    DataBaseHandle.m

    + (DataBaseHandle *)shareDataBase {
        @synchronized (self){
            if (handle == nil) {
                handle = [[DataBaseHandle alloc] init];
                
    //            [handle closeDB];
            }
        }
        return handle;
    }
    sqlite3 *db = nil;
    

      打开数据库

    - (void)openDB {
        NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
        NSString *path = [str stringByAppendingPathComponent:@"student.sqlite"];
        NSLog(@"%@",path);
        //打开数据库
        //UTF8String 将oc字符串转化为C语言字符串
    
        //方法执行完会返回一个数据库对象,这个对象已被初始化
        int result = sqlite3_open([path UTF8String], &db);
        //如果等于SQLITE_OK说明sql语句执行成功
        if (result == SQLITE_OK) {
            NSLog(@"数据库打开成功");
            //创建表格
            NSString *sqlString = @"create table if not exists Student (number integer primary key autoincrement,name text,gender text,age integer)";
              int result =  sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL);
            if (result == SQLITE_OK) {
                NSLog(@"见表成功");
            }
        } else {
            NSLog(@"数据库打开失败");
        }
    }
    

      关闭数据库

    - (void)closeDB {
        int result = sqlite3_close(db);
        if (result == SQLITE_OK) {
            NSLog(@"关闭成功");
        }else {
            NSLog(@"关闭失败");
        }
    }
    

      插入数据

    - (void)insertNewStudent:(Student *)student {
        [self openDB];
        //准备sql语句
        NSString *sqlString = @"insert into Student (name,gender, age) values (?, ?, ?)";
        /*第一个参数,数据库指针,
         第二个参数,sql语句
         第三个参数,sql语句的长度,写成-1,自动计算
         第四个参数,创建管理sql语句的类,statement
         第五个参数,预留参数
         */
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"添加语句成功");
            //绑定参数
            //绑定的参数:1.管理类指针,2.第几个问号,3.绑定的数据, 4.绑定数据的长度 -1   5.
            sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 3, (int)student.age);
            /**/
            sqlite3_step(stmt);
        } else {
            NSLog(@"添加语句失败");
        }
        sqlite3_finalize(stmt);
        [self closeDB];
    }
    

      查询数据

    - (NSMutableArray *)selectAllStudents {
        [self openDB];
        NSString *sqlString = @"select * from student";
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, nil);
        if (result == SQLITE_OK) {
            NSLog(@"查询全部成功");
            //循环的条件:下一行还有数据,这时就能一直循环下去
            NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
                NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
                NSInteger age = sqlite3_column_int(stmt, 3);
                
                Student *stu = [[Student alloc] init];
                stu.name = name;
                stu.age = age;
                stu.gender = gender;
                [array addObject:stu];
                [stu release];
            }
            sqlite3_finalize(stmt);
            [self closeDB];
    
            return array;
        } else {
            NSLog(@"error");
            return nil;
        }
    }
    

      

    - (Student *)selectStudentWithNumber:(NSInteger)number {
        [self openDB];
        
        NSString *sqlString = @"select * from Student where number = ?";
        
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"查询成功");
            //绑定参数
            sqlite3_bind_int(stmt, 1, (int)number);
            
            Student *student = [[[Student alloc] init]autorelease];
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                student.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
                student.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
                student.age = sqlite3_column_int(stmt, 3);
            }
            sqlite3_finalize(stmt);
            [self closeDB];
            return student;
            
        } else {
            NSLog(@"不OK");
            return nil;
        }
    }
    

      删除数据

    - (void)deleteStudentWithNumber:(NSInteger)number {
        [self openDB];
        NSString *sqlString = @"delete from Student where number = ?";
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            sqlite3_bind_int(stmt, 1, (int)number);
            //执行sql语句
            sqlite3_step(stmt);
        }
        //释放stmt的内存资源
        sqlite3_finalize(stmt);
        
        [self closeDB];
    }
    

      修改数据

    - (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number {
        [self openDB];
        
        NSString *sqlString = @"update Student set gender = ? where number = ?";
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
        
        if (result == SQLITE_OK) {
            sqlite3_bind_int(stmt, 2, (int)number);
            
            sqlite3_step(stmt);
        }
        sqlite3_finalize(stmt);
        [self closeDB];
    }
    

      

  • 相关阅读:
    Android VersionedGestureDetector手势事件
    Android drawBitmapMesh扭曲图像
    如何利用SVN合并代码
    Android 微信分享图文资料
    Android google map 两点之间的距离
    Android 监听ContentProvider的数据改变
    Android 自动朗读(TTS)
    Android ContentProvider的实现
    解决xcode升级之后安装的插件失效
    Android Studio 更换国内源下载依赖库
  • 原文地址:https://www.cnblogs.com/code-cd/p/4810261.html
Copyright © 2020-2023  润新知