现在的位置: 首页 > 综合 > 正文

使用IOS的嵌入式SQLite3

2013年09月04日 ⁄ 综合 ⁄ 共 2431字 ⁄ 字号 评论关闭

一、SQLite3简介

        SQLite3在存储和检索大量数据方面非常有效,它还能够对数据进行复杂的聚合,与使用对象执行这些操作相比,获得结果的速度更快。

        例如,如果应用程序需要计算应用程序中所有对象中特殊字段的总和,或者如果需要只符合特定条件的对象的总和,SQLite3将可以执行该操作,而不需要将每个对象加载到内存中。从SQLite3获取聚合比将所有对象加载到内存中,然后计算它们值的总和要快几个数量级。作为一个羽翼丰满的嵌入式数据库,SQLite3包含使其速度更快(例如,通过创建可以加快查询速度的表索引)的工具。

       SQLite3使用SQL(Structured Query Language,结构化查询语言)。SQL是与关系数据库交互的标准语言。关系数据库(包括SQLite3)和面向对象的编程语言使用完全不同的方法来存储和组织数据。这些方法非常不同,因而出现了用于在两者之间转换的各种技术以及很多库和工具。这些不同的技术统称为对象关系映射(object-relational mapping, ORM)。目前,有很多中ORM工具可用于Cocoa
Touch,比如Core Data

二、创建或打开数据库

        使用SQLite3之前,必须打开数据库。用于执行此操作的命令sqlite3_open()将打开一个现有数据库,如果指定位置上不存在数据库,则它会创建一个新的数据库。下面是打开数据库的代码:

//打开数据库
-(void)openDB
{
    //获取到sqlite数据库的路径
    NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"Plan" ofType:@"sqlite"];
    
    //由于SQLite3是采用可移植的C,因此需要将NSString字符串类型转换成C字符串
    const char *charPath = [dbPath UTF8String];
    
    //打开数据库,如果等于SQLITE_OK,则表示数据库已成功打开
    int result = sqlite3_open(charPath, &database);
    
    if(result == SQLITE_OK)
    {
        NSLog(@"数据库打开成功");
    }
    else
    {
        NSLog(@"数据库打开失败");
    }
}

        如果result等于常量SQLITE_OK,则表示数据库已成功打开。应当注意的是,数据库文件的路径必须作为C字符串(而非NSString)传递。因为SQLite3数据库是采用可移植的C(而非Object-C)编写的,它不知道什么是NSString。幸好有一个NSString方法,该方法可以从NSString实例生成C字符串:

const char *charPath = [dbPath UTF8String];


三、关闭数据库

 当你对SQLite3数据库执行完所有操作时,通过调用sqlite3_close()来关闭数据库:

//关闭数据库
-(void)closeDB
{
    sqlite3_close(database);
}

四、更新、插入和删除数据库(创建一个表为例)

数据库将其所有数据存储在表中,可以通过SQL CREATE语句来创建一个新表,并使用sqlite_exec将其传递到打开的数据库,如下所示:

-(void)createTable
{
    char *errorMessage;
    
    const char *createSQL = "create table if not exists People (pID integer primary key autoincrement , pName text)";
    
    int result = sqlite3_exec(database, createSQL, NULL, NULL, &errorMessage);
    if(result == SQLITE_OK)
    {
        NSLog(@"表创建成功");
    }
    else
    {
        NSLog(@"出现错误:%s", &errorMessage);
    }
}

执行该操作之前,需要检查result等于SQLITE_OK以确保命令成功运行。如果命令未成功运行,errorMessage将包含对所发生问题的描述。

函数sqlite3_exec用于针对SQLite3运行任何不返回数据的命令它用于执行更新、插入和删除操作。

五、查询数据库

从数据库中检索数据有点复杂,你必须首先通过向其输入SQL SELECT命令来准备该语法,并调用sqlite3_step()来依次遍历数据库:

-(void)query
{
    NSString *querySQL = @"select * from Artist ";
    
    sqlite3_stmt *statement;
    
    //执行查询
    int result = sqlite3_prepare(database, [querySQL UTF8String], -1, &statement, nil);
    
    if (result == SQLITE_OK)
    {
        //如果查询有语句就执行step来添加数据
        while (sqlite3_step(statement) == SQLITE_ROW)                             
        {
            int rowNum = sqlite3_column_int(statement, 0);
            char *rowData = (char *)sqlite3_column_text(statement, 1);

            NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
            NSLog(@"第%d个为:%@", rowNum, fieldValue);
        }
        sqlite3_finalize(statement);
    }
}

如果result等于SQLITE_OK,则你的语句已经准备成功,可以开始单步调试结果集。上面的例子是从数据库中检索int和NSString的示例。

如上所述,简单的数据库打开、关闭、创建表、修改、删除、查询等操作都是调用对应的方法即可。其实最主要的还是SQL语句应该写正确。


抱歉!评论已关闭.