• ios对SQLite3的使用


    一、在Firefox中打开sqlite3(如果没有,选择工具->附加组件,添加即可)新建sqlite3数据库,Contacts,

    建立一个members表,字段 id,integer,主键,自增;name,varchar;email,varchar,null;birthday,datetime,null。

    向表中添加一些数据:

     

     二、新建Empty Appliation,添加一个HomeViewController,和一个组件libsqlite3.dylib,来支持对sqlite3的连接,关闭,增删改查等操作。

    1. HomeViewController.h代码:

    #import <UIKit/UIKit.h>
    #import "sqlite3.h"
     
    @interface HomeViewController : UIViewController{
     
        sqlite3 *db; //声明一个sqlite3数据库
    }
     
    - (NSString *)filePath;//数据库文件的路径。一般在沙箱的Documents里边操作
     
    @end
     

    2. HomeViewController.m代码: 

     #import "HomeViewController.h"

     
     
    @interface HomeViewController ()
     
    @end
     
    @implementation HomeViewController
     

    //该方法用于返回数据库在Documents文件夹中的全路径信息 

    - (NSString *)filePath{
     
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [paths objectAtIndex:0];
        return [documentsDir stringByAppendingPathComponent:@"Contacts.sqlite"];
    }
     

    //打开数据库的方法 

    - (void)openDB{
     
        if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(0, @"数据库打开失败。");
        }
    }
     
    //插入数据方法
    - (void)insertRecordIntoTableName:(NSString *)tableName
                           withField1:(NSString *)field1 field1Value:(NSString *)field1Value
                            andField2:(NSString *)field2 field2Value:(NSString *)field2Value
                            andField3:(NSString *)field3 field3Value:(NSString *)field3Value{
    /*方法1:经典方法
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%@', '%@', '%@')", tableName, field1, field2, field3, field1Value, field2Value, field3Value];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(0, @"插入数据错误!");
        }
        */

       //方法2:变量的绑定方法 

        NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",tableName, field1, field2, field3];
        
        sqlite3_stmt *statement;
        
        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
            sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL);
            sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL);
            sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL);
        }
        if (sqlite3_step(statement) != SQLITE_DONE) {
            NSAssert(0, @"插入数据失败!");
            sqlite3_finalize(statement);
        }
     
                                    
    }
    //查询数据
    - (void)getAllContacts{
     
        NSString *sql = @"SELECT * FROM members";
        sqlite3_stmt *statement;
        
        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                
                char *name = (char *)sqlite3_column_text(statement, 0);
                NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
                
                char *email = (char *)sqlite3_column_text(statement, 1);
                NSString *emailStr = [[NSString alloc] initWithUTF8String:email];
                
                char *birthday = (char *)sqlite3_column_text(statement, 2);
                NSString *birthdayStr = [[NSString alloc] initWithUTF8String:birthday];
                
                NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
                                  nameStr, emailStr, birthdayStr];
                
                NSLog(info);
                
                [nameStr release];
                [emailStr release];
                [birthdayStr release];
                [info release];
            }
            sqlite3_finalize(statement);
        }
    }
     
    - (void)viewDidLoad
    {
        [self openDB];
       
        [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李1" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
        
        [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
        
        [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
        
        
        
        [self getAllContacts];
        
        sqlite3_close(db);
        
        [super viewDidLoad];
    }
     
    @end
     

    插入数据后的效果:

     

    查询的效果:

     

    三、小结:

      1.数据查询:sqlite3_exec()函数执行sql语句,在没有返回值的情况下(比如创建表格、插入记录、删除记录等操作中)很好用。

                     也会用到sqlite3_stat结构、sqlite3_prepare_v2()函数、sqlte3_step()函数和sqlite3_finalize()函数。

           查询分三个阶段:准备阶段:sqlite3_stat、sqlite3_prepare_v2() 

           执行阶段:sqlte3_step() 

         终止阶段: sqlite3_finalize() 

     2.附表:

    sqlite3数据库打开时的返回值及其所代表的含义

    返回值

    描述

    返回值

    描述

    SQLITE_OK=0

    返回成功

    SQLITE_FULL=13

    数据库满,插入失败

    SQLITE_ERROR=1

    Sql错误或错误的数据库

    SQLITE_CANTOPEN=14

    不能打开数据库文件

    SQLITE_INTERNAL=2

    Sqlite的内部逻辑错误

    SQLITE_PROTOCOL=15

    数据库锁定协议错误

    SQLITE_PERM=3

    拒绝访问

    SQLITE_EMPTY=16

    数据库表为空

    SQLITE_ABORT=4

    回调函数请求中断

    SQLITE_SCHEMA=17

    数据库模式改变

    SQLITE_BUSY=5

    数据库文件被锁

    SQLITE_TOOBIG=18

    一个表数据行过多

    SQLITE_LOCKED=6

    数据库中的一个表被锁

    SQLITE_CONSTRAINT=19

    由于约束冲突而中止

    SQLITE_NOMEN=7

    内存分配失败

    SQLITE_MISMATCH=20

    数据类型不匹配

    SQLITE_READONLY=8

    试图对一个只读数据库进行写操作

    SQLITE_MISUSE=21

    数据库错误使用

    SQLITE_INTERRUPT=9

    由sqlite_interrupt()结束操作

    SQLITE_NOLFS=22

    使用主机操作系统不支持的特性

    SQLITE_IOERR=10

    磁盘I/O发生错误

    SQLITE_AUTH=23

    非法授权

    SQLITE_CORRUPT=11

    数据库磁盘镜像畸形

    SQLITE_FORMAT=24

    辅助数据库格式错误

    SQLITE_NOTFOUND=12

    (Internal Only)表或记录不存在

    SQLITE_NOTADB=26

    打开的不是一个数据库文件

    致力于ios开发
     
     
  • 相关阅读:
    带权并查集
    Dungeon Master (luo 三维 BFS )
    迷宫问题 (最短路径保存输出)
    Aggressive cows (北京大学ACM-ICPC竞赛训练暑期课 )
    滑雪 (北京大学ACM-ICPC竞赛训练暑期课 )
    棋盘问题 (北京大学ACM-ICPC竞赛训练暑期课 )
    简单的整数划分问题 ( 北京大学ACM-ICPC竞赛训练暑期课 )
    马走日 (DFS)
    蓝桥杯 (计算路径)
    最长单词 (分割字符串)(蓝桥杯-算法提高)
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4181620.html
Copyright © 2020-2023  润新知