• sqlite


     1 #import "ViewController.h"
     2 #import <sqlite3.h>//导入数据库头文件
     3 
     4 @interface ViewController ()
     5 {
     6     sqlite3 *db;
     7 }
     8 @end
     9 
    10 @implementation ViewController
    11 
    12 - (void)viewDidLoad {
    13     [super viewDidLoad];
    14     /*
    15      1、    Sqlite数据类型:NULL. 空值、INTEGER. 整型、REAL.浮点型、TEXT.文本类型、BLOB. 二进制类型,用来存储文件,比如图片
    16      2、    使用sqlite3需要先导入libsqlite3.dylib并导入主头文件
    17      3、    设置数据库文件存放路径,如沙盒的Doucuments文件夹内
    18      */
    19     sqlite3_close(db);
    20 //一般会把数据库文件放入沙盒,所以需要先设定存放路径
    21     NSString *pathString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ] stringByAppendingPathComponent:@"mySql.sqlite"];
    /*

    SQLITE_API int SQLITE_STDCALL sqlite3_open(

      const char *filename,   /* Database filename (UTF-8) */

      sqlite3 **ppDb          /* OUT: SQLite db handle */

    );

    */
    22 //sqlite3_open方法,打开数据库文件,第一个参数代表数据库文件的路径,注意需要调用UTF8String方法将NSString转换成C的字符串格式,第二个参数代表数据库对象,该方法如果返回0(SQLITE_OK),代表数据库代开成功,如果该路径没有数据库文件,则先创建再打开,否则直接打开
    23     int res = sqlite3_open([pathString UTF8String], &db);
    24 //创建数据库表
    25 //数据库表创建语句:create table if not exists(如果表不存在) Student(表名,自己定义) (该括好放要保存的信息:字段名 字段格式,多个字段之间用逗号隔开)
    26     NSString *s = @"create table if not exists Student(name TEXT,age INTEGER)";//如果数据库中没有Student表,则创建该表,包含 字符串形式的name和整型的age
    27 //执行数据库语句: 第一个参数代表执行的数据库对象,也就是打开的数据库,第二个参数代表执行语句,后面三个直接给NULL即可
    28     sqlite3_exec(db, [s UTF8String], NULL, NULL, NULL);
    /*

    SQLITE_API int SQLITE_STDCALL sqlite3_exec(

      sqlite3*,                                  /* An open database */

      const char *sql,                           /* SQL to be evaluated */

      int (*callback)(void*,int,char**,char**),  /* Callback function */

      void *,                                    /* 1st argument to callback */

      char **errmsg                              /* Error msg written here */

    );

    */
    29  NSLog(@"%@******%d",pathString,res);
    30 /********数据库增加数据********/
    31     //sql插入语句:insert into Student(表名) (要进行保存的字段名,名字之间用逗号隔开) values(要保存的实际数据,多个数据用逗号隔开,注意:此处数据要与前面的字段名保持一致,且如果是TEXT类型,需要用单引号引起来)
    32     NSString *insertSql = @"insert into Student (name,age) values('刘冠',21)";
    33     //执行插入语句
    34      sqlite3_exec(db, [insertSql UTF8String], NULL, NULL, NULL);
    35     
    36     NSString *insertSql1 = @"insert into Student (name,age) values('王峰',23)";
    37     //执行插入语句
    38      sqlite3_exec(db, [insertSql1 UTF8String], NULL, NULL, NULL);
    39     
    40     NSString *insertSql2 = @"insert into Student (name,age) values('李龙',19)";
    41     //执行插入语句
    42      sqlite3_exec(db, [insertSql2 UTF8String], NULL, NULL, NULL);
    43 /***********删除操作**********/
    44     //sql删除语句: delete(关键字) from Student(表名) where(条件关键字) name(字段名) = ‘李龙’(要删除数据的条件,如果是TEXT,用单引号引起来)
    45     NSString *delSql = @"delete from Student where name = '李龙'";
    46      sqlite3_exec(db, [delSql UTF8String], NULL, NULL, NULL);
    47     //全部删除
    48 //    NSString *delAll = @"delete from Student";
    49 //    sqlite3_exec(db, [delAll UTF8String], NULL, NULL, NULL);
    50     //改(更新)
    51     //sql更新语句:update(关键字) Student(表名) set(关键字,赋值) age(字段名) = 25(要更改的值,如果要更新多个字段,则用逗号隔开) where(条件关键字) rowid(字段名) = 2(要改的行,从1开始)
    52     NSString *updateSql = @"update Student set age = 25, name = '刘冠冠' where rowid = 2";
    53     sqlite3_exec(db, [updateSql UTF8String], NULL, NULL, NULL);
    54 //    //查询
    55 //    //查询语句
    56 //    //查询所有:select(关键字) * from Student(表名)
    57 //    NSString *querySql = @"select * from Student";
    58 //    sqlite3_stmt *_stmt = nil;//用于存放查询结果
    59 //    int rest1 = sqlite3_prepare(db, [querySql UTF8String], -1, &_stmt, NULL);//检查sql语句的合法性,如果合法则直接运行,返回结果为0
    /*

    SQLITE_API int SQLITE_STDCALL sqlite3_prepare(

      sqlite3 *db,            /* Database handle */

      const char *zSql,       /* SQL statement, UTF-8 encoded */

      int nByte,              /* Maximum length of zSql in bytes. */

      sqlite3_stmt **ppStmt,  /* OUT: Statement handle */

      const char **pzTail     /* OUT: Pointer to unused portion of zSql */

    );

    */
    60 //    if(rest1 == SQLITE_OK)
    61 //    {
    62 //         //遍历结果集_stmt,如果sqlite3_step返回100,代表有查询结果,先取出第一条,然后再指向下一条,直到sqlite3_step返回101,代表遍历结束
    //
    SQLITE_API int SQLITE_STDCALL sqlite3_step(sqlite3_stmt*);
    63 //        while (SQLITE_ROW == sqlite3_step(_stmt)) {
    64 //            //取出单行结果中的某一列,从0开始
    65 //            const unsigned char *s = sqlite3_column_text(_stmt, 0);
    //
    SQLITE_API const unsigned char *SQLITE_STDCALL sqlite3_column_text(sqlite3_stmt*, int iCol);column纵列

    SQLITE_API const void *SQLITE_STDCALL sqlite3_column_blob(sqlite3_stmt*, int iCol);

    SQLITE_API int SQLITE_STDCALL sqlite3_column_bytes(sqlite3_stmt*, int iCol);

    SQLITE_API int SQLITE_STDCALL sqlite3_column_bytes16(sqlite3_stmt*, int iCol);

    SQLITE_API double SQLITE_STDCALL sqlite3_column_double(sqlite3_stmt*, int iCol);

    SQLITE_API int SQLITE_STDCALL sqlite3_column_int(sqlite3_stmt*, int iCol);

    SQLITE_API sqlite3_int64 SQLITE_STDCALL sqlite3_column_int64(sqlite3_stmt*, int iCol);

    SQLITE_API const unsigned char *SQLITE_STDCALL sqlite3_column_text(sqlite3_stmt*, int iCol);

    SQLITE_API const void *SQLITE_STDCALL sqlite3_column_text16(sqlite3_stmt*, int iCol);

    SQLITE_API int SQLITE_STDCALL sqlite3_column_type(sqlite3_stmt*, int iCol);

    SQLITE_API sqlite3_value *SQLITE_STDCALL sqlite3_column_value(sqlite3_stmt*, int iCol);

    66 //            //将查询结果转换成oc字符串
    67 //            NSString *name = [NSString stringWithUTF8String:(const char *)s];
    68 //            NSLog(@"结果:%@",name);
    69 //        }
    70 //    }
    71     //查询符合条件的结果
    72     NSString *querySql1 = @"select * from Student where age < 23";
    73     sqlite3_stmt *_stmt1 = nil;//用于存放查询结果
    //推荐在现在任何的程序中都使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容
    74 int res2 = sqlite3_prepare(db, [querySql1 UTF8String], -1, &_stmt1, NULL);//检查sql语句的合法性,如果合法则直接运行,返回结果为0 75 if (res2 == 0) { 76 //遍历结果集_stmt,如果sqlite3_step返回100,代表有查询结果,先取出第一条,然后再指向下一条,直到sqlite3_step返回101,代表遍历结束 77 while (SQLITE_ROW == sqlite3_step(_stmt1)) { 78 //取出单行结果中的某一列,从0开始 79 const unsigned char *s = sqlite3_column_text(_stmt1, 0); 80 //将查询结果转换成oc字符串 81 NSString *name = [NSString stringWithUTF8String:(const char *)s]; 82 83 NSLog(@"--结果:%@",name); 84 } 85 } 86 sqlite3_close(db);//关闭数据库 87 88 }
  • 相关阅读:
    redis持久化之AOF和RDB
    pycharm快捷键
    500系列错误
    400系列错误
    Linux常用命令大全
    从浏览器输入一个地址,发送请求,经历了哪些过程(面试问题)
    401的错误分析
    301和302的区别
    数据库 语法收集 (主 mysql,次oracle,日常积累)
    python 发送邮件 smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') 以及授权码设置步骤
  • 原文地址:https://www.cnblogs.com/liuguan/p/5006355.html
Copyright © 2020-2023  润新知