iOS基础知识----SQLite数据库操作

1 SQLite支持的数据类型

  INTEGER          有符号整型

  REAL             浮点型

  TEXT             字符型类型,采用UTF-8、UTF-16编码

  VERCHAR CHAR CLOB       大二进制对象类型,能够存放任何二进制数据

  FLOAT DOUBLE          转换成为REAL

  NUMERIC              转换为INTEGER或者REAL类型

  没有布尔类型数据       可以用0和1来代替

  没有日期和时间类型数据    存储在TEXT或REAL类型中

2 SQLite语句

  (1)创建数据表

    指令:create table 表名(字段1, 字段2,...);

    示例:create tabel USER(uid,name, age);

  (2)条件创建:如果不存在则创建

    指令:create table if not exists 表名(字段1, 字段2,...);

    示例:create table if not exists USER(uid,name,age);

  (3)删除表

    指令:drop table 表名;

    示例:drop table USER;

  (4)插入

    指令:insert table 表名(字段1,字段2,...) values(值1,值2,...);

    示例:insert table USER(sex,address) values(女,北京);

  (5)查询

    指令:select 字段 from 表名;

    示例:select (uid,name) from USER;

       select * from USER;

  (6)修改

    指令:update 表名 set 字段 = ‘新值’ where 条件

    示例:update USER set age = 21 where uid = 1001

3  创建数据库

  (1) 使用sqlite3_open函数打开数据库

  (2) 使用sqlite3_exec函数执行Create Table语句

  (3) 使用sqlite3_close函数关闭数据库

4 查询数据

  (1) 使用sqlite_prepare_v2函数预处理SQL语句

  (2) 使用sqlite_bind_text函数绑定参数

  (3) 使用sqlite3_step函数执行SQL语句,遍历结果集

  (4) 使用sqlite3_column_text等函数提取字段数据

#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"

@interface StudentManager : NSObject {
    sqlite3 *db;
}

+ (instancetype)sharedInstance;

// 查询
- (Student *)searchWithUid:(Student *)student;

// 插入
- (int)insertStudent:(Student *)student;

@end


#import "StudentManager.h"

#define kNameFile (@"Student.sqlite")

@implementation StudentManager

+ (instancetype)sharedInstance {

    static StudentManager *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
        [instance createDataBaseTabelIfNeeded];
    });
    return instance;
}

- (NSString *)applicationDocumentsDiractory {
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [paths firstObject];
    
    NSString *filePath = [documentPath stringByAppendingString:kNameFile];
    
    return filePath;
}

/*
 创建数据库
 1 使用sqlite3_open函数打开数据库
 2 使用sqlite3_exec函数执行Create Table语句
 3 使用sqlite3_close函数关闭数据库
 */
- (void)createDataBaseTabelIfNeeded {
    
    NSString *writablePath = [self applicationDocumentsDiractory];
    NSLog(@"数据库的地址是:%@", writablePath);
    // 打开数据库
    /*
     第一个参数:数据库文件所在的完整路径
     第二个参数:数据库 DataBase对象
     */
    if (sqlite3_open([writablePath UTF8String], &db) != SQLITE_OK) {
        //数据库打开失败
        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败");
        
    } else {
        
        char *error;
        NSString *createSQL = [NSString stringWithFormat:@"create table if not exists Student(uid TEXT primary key,name TEXT);"];
        /*
         第一个参数:数据库
         第二个参数:sql语句
         第三个参数:回调函数
         第四个参数:回调所传的参数
         第五个参数:error
         */
        if (sqlite3_exec(db, [createSQL UTF8String], NULL, NULL, &error) != SQLITE_OK) {
            // 语句执行失败
            sqlite3_close(db);
            NSAssert(NO, @"语句执行失败 %s", error);
        } else {
            sqlite3_close(db);
        }
    }
}

/*
 查询数据
 1 使用sqlite_prepare_v2函数预处理SQL语句
 2 使用sqlite_bind_text函数绑定参数
 3 使用sqlite3_step函数执行SQL语句,遍历结果集
 4 使用sqlite3_column_text等函数提取字段数据
 */
- (Student *)searchWithUid:(Student *)student {
    
    NSString *path = [self applicationDocumentsDiractory];
    
    if(sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
        
        //数据库打开失败
        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败");
        
    } else {
    
        NSString *sql = @"select uid,name from Student where uid = ? ";
        
        sqlite3_stmt *statement;
        
        /* 
         使用sqlite_prepare_v2函数预处理SQL语句
         第一个参数:数据库
         第二个参数:SQL语句
         第三个参数:执行语句的长度 -1表示全部长度
         第四个参数:语句对象
         第五个参数:没有执行语句的部分 NULL
         */
        if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) {
            
            // 按主键查询数据库
            NSString *uid = student.uid;
            NSString *name = student.name;
            /*
             使用sqlite_bind_text函数绑定参数
             第一个参数:语句对象
             第二个参数:参数开始执行的序号
             第三个参数:我们要绑定的值
             第四个参数:绑定的字符串的长度
             第五个参数:指针 NULL
             */
            sqlite3_bind_text(statement, 1, [uid UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [name UTF8String], -1, NULL);
            
            /*
             使用sqlite3_step函数执行SQL语句,遍历结果集
             y偶一个返回值 SQLITE_ROW常量表示查出来了
             */
            if(sqlite3_step(statement) == SQLITE_ROW) {
            
                /*
                 使用sqlite3_column_text等函数提取字段数据
                 第一个参数:语句对象
                 第二个参数:字段索引
                 */
                char *uid = (char *)sqlite3_column_text(statement, 0);
                NSString *uidStr = [NSString stringWithUTF8String:uid];
                
                char *name = (char *)sqlite3_column_text(statement, 1);
                NSString *nameStr = [NSString stringWithUTF8String:name];
                
                Student *s = [[Student alloc] init];
                s.uid = uidStr;
                s.name = nameStr;
                
                sqlite3_finalize(statement);
                sqlite3_close(db);
                
                return s;
            }
        }
        
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    return nil;
}

- (int)insertStudent:(Student *)student {

    NSString *path = [self applicationDocumentsDiractory];
    
    if(sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
    
        //数据库打开失败
        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败");
        
    } else {
    
        NSString *sql = @"INSERT OR REPLACE INTO Student (uid, name) VALUES (?, ?)";
        
        sqlite3_stmt *statement;
        
        if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) {
        
            sqlite3_bind_text(statement, 1, [student.uid UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [student.name UTF8String], -1, NULL);
            
            if (sqlite3_step(statement) != SQLITE_DONE) {
                
                //插入数据失败
                sqlite3_close(db);
                NSAssert(NO, @"插入数据失败");
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
    }
    return 0;
}
@end

 

posted @ 2017-03-02 17:45  紫洁  阅读(269)  评论(0编辑  收藏  举报