• 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
  • 相关阅读:
    MyBatis的分页插件PageHelper
    Mybatis的插件 PageHelper 分页查询使用方法
    textarea还剩余字数统计,支持复制粘贴的时候统计字数
    Mybatis——oracle——sql语句结尾不加;
    window.location.href和window.open的几种用法和区别
    window.location.href的用法(动态输出跳转)
    mybatis rownum Oracle 随机
    java 回车替换换行
    session 取
    socket编程浅知识
  • 原文地址:https://www.cnblogs.com/muzijie/p/6491783.html
Copyright © 2020-2023  润新知