zoukankan      html  css  js  c++  java
  • iphone开发-SQLite数据库使用

    我现在要使用SQLite3.0创建一个数据库,然后在数据库中创建一个表格。

    首先要引入SQLite3.0的lib库。然后包含头文件#import <sqlite3.h>

    【1】打开数据库,如果没有,那么创建一个

    复制代码
    sqlite3* database_;
    -(BOOL) open{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mydb.sql"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL find = [fileManager fileExistsAtPath:path];
    //找到数据库文件mydb.sql
    if (find) {
    NSLog(@"Database file have already existed.");
    if(sqlite3_open([path UTF8String], &database_) != SQLITE_OK) {
    sqlite3_close(database_);
    NSLog(@"Error: open database file.");
    return NO;
    }
    return YES;
    }
    if(sqlite3_open([path UTF8String], &database_) == SQLITE_OK) {
    bFirstCreate_ = YES;
    [self createChannelsTable:database_];//在后面实现函数createChannelsTable
    return YES;
    } else {
    sqlite3_close(database_);
    NSLog(@"Error: open database file.");
    return NO;
    }
    return NO;
    }
    复制代码


    【2】创建表格

    复制代码
     1 //创建表格,假设有五个字段,(id,cid,title,imageData ,imageLen )
    2 //说明一下,id为表格的主键,必须有。
    3 //cid,和title都是字符串,imageData是二进制数据,imageLen 是该二进制数据的长度。
    4
    5 - (BOOL) createChannelsTable:(sqlite3*)db
    6 {
    7 char *sql = "CREATE TABLE channels (id integer primary key,
    8 cid text,
    9 title text,
    10 imageData BLOB,
    11 imageLen integer)";
    12 sqlite3_stmt *statement;
    13 if(sqlite3_prepare_v2(db, sql, -1, &statement, nil) != SQLITE_OK) {
    14 NSLog(@"Error: failed to prepare statement:create channels table");
    15 return NO;
    16 }
    17 int success = sqlite3_step(statement);
    18 sqlite3_finalize(statement);
    19 if ( success != SQLITE_DONE) {
    20 NSLog(@"Error: failed to dehydrate:CREATE TABLE channels");
    21 return NO;
    22 }
    23 NSLog(@"Create table 'channels' successed.");
    24 return YES;
    25 }
    复制代码

     

    【3】向表格中插入一条记录

    假设channle是一个数据结构体,保存了一条记录的内容。
    复制代码
    - (BOOL) insertOneChannel:(Channel*)channel
    {
    NSData* ImageData = UIImagePNGRepresentation( channel.image_);
    NSInteger Imagelen = [ImageData length];
    sqlite3_stmt *statement;
    static char *sql = "INSERT INTO channels (cid,title,imageData,imageLen)
    VALUES(?,?,?,?)";
    //问号的个数要和(cid,title,imageData,imageLen)里面字段的个数匹配,代表未知的值,将在下面将值和字段关联。
    int success = sqlite3_prepare_v2(database_, sql, -1, &statement, NULL);
    if (success != SQLITE_OK)
    {
    NSLog(@"Error: failed to insert:channels");
    return NO;
    }

    //这里的数字1,2,3,4代表第几个问号
    sqlite3_bind_text(statement, 1, [channel.id_ UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(statement, 2, [channel.title_ UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_blob(statement, 3, [ImageData bytes], Imagelen, SQLITE_TRANSIENT);
    sqlite3_bind_int(statement, 4, Imagelen);

    success = sqlite3_step(statement);
    sqlite3_finalize(statement);

    if (success == SQLITE_ERROR) {
    NSLog(@"Error: failed to insert into the database with message.");
    return NO;
    }

    NSLog(@"Insert One Channel#############:id = %@",channel.id_);
    return YES;
    }
    复制代码
     
    【4】数据库查询
    这里获取表格中所有的记录,放到数组fChannels中。
    复制代码
    - (void) getChannels:(NSMutableArray*)fChannels
    {
    sqlite3_stmt *statement = nil;
    char *sql = "SELECT * FROM channels";
    if (sqlite3_prepare_v2(database_, sql, -1, &statement, NULL) != SQLITE_OK)
    {
    NSLog(@"Error: failed to prepare statement with message:get channels.");
    }
    //查询结 果集中一条一条的遍历所有的记录,这里的数字对应的是列值。
    while (sqlite3_step(statement) == SQLITE_ROW)
    {
    char* cid = (char*)sqlite3_column_text(statement, 1);
    char* title = (char*)sqlite3_column_text(statement, 2);
    Byte* imageData = (Byte*)sqlite3_column_blob(statement, 3);
    int imageLen = sqlite3_column_int(statement, 4);
    Channel* channel = [[Channel alloc] init];
    if(cid)
    channel.id_ = [NSString stringWithUTF8String:cid];
    if(title)
    channel.title_ = [NSString stringWithUTF8String:title];
    if(imageData)
    {
    UIImage* image = [UIImage imageWithData:[NSData dataWithBytes:imageData length:imageLen]];
    channel.image_ = image;
    }
    [fChannels addObject:channel];
    [channel release];
    }
    sqlite3_finalize(statement);
    }
  • 相关阅读:
    2018年底,IOS面试题的复习之OC的反射机制
    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
    frame和bounds有什么不同?
    【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?
    IOS MVC与MVVM的区别
    IOS面试题2018/11/17
    OC的反射机制
    git使用
    mac git 删除本地仓库文件
    Android hide the app icon but show the icon most left
  • 原文地址:https://www.cnblogs.com/lisa090818/p/3183572.html
Copyright © 2011-2022 走看看