• SQLite数据库---将复杂对象存入数据库


    1.插入数据---这里BOOK是一个书类

    #pragma makr 插入数据
    - (void)insetIntoTableWithID:(int)nameID withName:(NSString *)name withSex:(NSString *)sex withBook:(Book *)abook
    {
    
        // 对abook进行归档(先归档)
        NSMutableData *data = [NSMutableData data];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        [archiver encodeObject:abook forKey:abook.bookName]; // abook.bookName***key不能一样否则会覆盖
        [archiver finishEncoding];
        // sql语句
        NSString *sqlString = [NSString stringWithFormat:@"INSERT INTO 'user_hh'('id','name','sex','book')VALUES(?, ?, ?,?)"];
        sqlite3_stmt *stmt = nil;
        int result = sqlite3_prepare(db, [sqlString UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            // 绑定字段
            // sql里面写了字段,字段从一开始
            sqlite3_bind_int(stmt, 1, nameID);
            sqlite3_bind_text(stmt, 2, [name UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [sex UTF8String], -1, NULL);
            sqlite3_bind_blob(stmt, 4, [data bytes], (int)[data length], NULL);
            // 执行
            sqlite3_step(stmt);
        }
        // 结束
        sqlite3_finalize(stmt);
    
        // 插入语句
        /*
         NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO 'user_hh'('id','name','sex','book')VALUES('%d', '%@', '%@','%@')",nameID,name,sex,data];
        // 执行SQL语句
        int result = sqlite3_exec(db, [insertSql UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"插入成功");
        }else{
        
            NSLog(@"插入失败");
        }
         */
      
    }

    2.查询数据库

    #pragma mark 查询数据库
    - (void)selectDataFromTable
    {
    
        NSString *selectSql = [NSString stringWithFormat:@"SELECT *FROM 'user_hh'"];
       
        // 保存查询到的结果集
        sqlite3_stmt *stmt = nil;
        // 准备查询数据(预存取)
        int result = sqlite3_prepare(db, [selectSql UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            
            // 判断是否是最后一行,有没有必要继续下去
            // 这里用while循环 一行一行执行 ******不用if******
            while(sqlite3_step(stmt) == SQLITE_ROW) {
                // 拿出各列的数据
                
                // 1.拿出id列的数据
                int numberID = sqlite3_column_int(stmt, 0);
                
                // 2.拿出name列的数据
                const unsigned char *nameChar = sqlite3_column_text(stmt, 1);
                NSString *name = [NSString stringWithUTF8String:(const char *)nameChar];
                
                // 3.拿出sex列的数据
                const unsigned char *sexChar = sqlite3_column_text(stmt, 2);
                NSString *sex = [NSString stringWithUTF8String:(const char *)sexChar];
                
                // 4.拿出BOOK列   ******桥接******
                
                // NSData *data = (__bridge NSData *)(sqlite3_column_blob(stmt, 3));
                const void *bytes = (sqlite3_column_blob(stmt, 3));
                int length = sqlite3_column_bytes(stmt, 3);
                NSData *data = [[NSData alloc] initWithBytes:bytes length:length];
                
                // 反归档
                NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
                Book *thisBook = [unArchiver decodeObjectForKey:@"西游记"];
                [unArchiver finishDecoding]; // 结束反归档
                
                NSLog(@"%d %@ %@ %@",numberID,name,sex,thisBook.bookName);
            }
            
            // 结束查询 --- 重要 ****** 否则无法关闭数据库******
            sqlite3_finalize(stmt);
        }
    }

    3.这里BOOK类对属性需要编码和反编码(NSCoding协议)

    -(void)encodeWithCoder:(NSCoder *)aCoder
    {
    
        [aCoder encodeObject:self.bookName forKey:@"bookName"];
        
    }
    -(id)initWithCoder:(NSCoder *)aDecoder
    {
    
        self = [super init];
        if (self) {
            self.bookName = [aDecoder decodeObjectForKey:@"bookName"];
        }
        return self;
    }
  • 相关阅读:
    终于开通了
    <input>表单元素readonly时光标仍然可见
    关于字体
    SSI架构中get***方法潜在调用
    为uploads文件夹瘦身
    在JSP里使用CKEditor和CKFinder
    centos5.5上搭建svn服务器
    多文件上传
    属性化ATL,DCOM,SIM,IID
    BSTR转换成char*
  • 原文地址:https://www.cnblogs.com/bachl/p/4674329.html
Copyright © 2020-2023  润新知