【iOS开发】---- SQLite3(附Demo)

       先上源码SQLite3源码

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

       关于"SQLite"的发音,大多数正式文档将其读为“Ess-Queue-Ell-Light”。

       下面我们开始新建一个工程:SQLite3Demo工程目录如下:

       在访问SQLite3时要通过一个过程API,此API提供了很多C函数调用的接口。要使用此API,需要将应用程序链接到一个名为libsqlite3.dylib的动态库。在Xcode4.5版本,添加方法如下图所示(其它版本可百度,or谷歌):


点击上图中Linked Frameworks and Libraries下面的‘+’号,


        这里注意别选错了,务必选中libsqlite3.dylib,它是始终指向最新版本的SQLite3库的别名

        先把界面画好(这个很简单,就不上代码了),界面如下:


        现在我们来创建一个数据库,在MyViewController.h中添加如下代码:

#import <UIKit/UIKit.h>

#import <sqlite3.h>

#define kFilename @"data.sqlite3"

@interface MyViewController : UIViewController
{
    sqlite3 *database;
}
-(NSString *)dataFilePath;
@end


      在.m文件中添加对应的实现代码(已添加相应的注释):

#import "MyViewController.h"

@interface MyViewController ()

@end

@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor underPageBackgroundColor];
    
    //打开数据库,若不存在,则创建它,否则打开它。
    if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK)
    {
        sqlite3_close(database);
    }
}

-(NSString *)dataFilePath
{
    /*常量NSDocumentDirectory表明我们正在查到Document目录的路径。
     第二个常量NSUserDomainMask表明我们将搜索限制于我们应用程序的沙河。*/
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

       可以先运行一下,然后去Document目录下,可以看到名为data.sqlite3的文件,表明数据库创建成功。

       然后必须要有一个容纳数据的表,创建一个表Student,Student包含了三个字段:studentId,name,achieve.代码与注释如下:

    //创建表
    char *errorMsg;
    //sql语句也可以用c来写,比如-(void)saveData函数中的updata语句,注意比较两者的不同
    //sql语句写好后可以把语句复制到数据库中去执行一下,看看写的是否正确。
    NSString *createSql = @"create  table if not exists Student(studentID integer primary key, name text,achieve text)";
    if (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK)
    {
        sqlite3_close(database);
        NSAssert1(0, @"error create table:%s", errorMsg);
    }

        每次登录以后,你需要显示保存的数据,这就需要查询数据库中的数据:

    //查询
    NSString *query = @"select * from Student";
    sqlite3_stmt *statement ;
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        while (sqlite3_step(statement)==SQLITE_ROW) {
            //注意计数,取值从零开始
            NSInteger studentId = sqlite3_column_int(statement, 0);
            NSString      *name = [self char2String:(char *)sqlite3_column_text(statement, 1)] ;
            NSString   *achieve = [self char2String:(char *)sqlite3_column_text(statement, 2)] ;
            
            studentIDField.text = [NSString stringWithFormat:@"%d",studentId];
            nameField.text = name;
            achievementField.text = achieve;
        }
  
    }

          由于sqlite3_column_text(,)取到的值是char类型,需要做相应的转换,将char转为NSString类型:

-(NSString*)char2String:(char*)c
{
    NSString *s = (c) ? [NSString stringWithUTF8String:c] : @"";
    return s;
}


      输入数据:学号20130202,姓名shenjx,成绩125,完成之后点击保存,执行以下保存动作:

-(void)saveData
{
    if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK)
    {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database!");
    }
    char *errorMsg = nil;
    char *update = "insert or replace into Student(studentId,name,achieve) values(?,?,?)";
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK)
    {
        //注意计数,绑定参数从1开始计数
        sqlite3_bind_int(stmt, 1, [studentIDField.text intValue]);
        sqlite3_bind_text(stmt, 2, [nameField.text UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 3, [achievementField.text UTF8String], -1, NULL);

    }
    
    if (sqlite3_step(stmt) != SQLITE_DONE)
    {
        NSAssert1(0, @"error create table:%s", errorMsg);
        sqlite3_finalize(stmt);
    }
    sqlite3_close(database);
}

       任何绑定函数的第一个参数都是指向之前在 sqlite3_prepare_v2()调用中使用的sqlite3_stmt,第二个参数是绑定的变量的索引。sql语句中第一个问号的索引是1。第三个参数表示替换问号的值。大多数绑定函数都只有三个参数,只有少数,比如绑定文本和二进制数据的函数还有另外两个参数。第一个参数是在第三个参数中传递数据的长度,对于c字符串,可以传递-1开代替字符串的长度,而函数将使用整个字符串。最后一个参数是可选的函数回调,用于在语句执行后完成内存清理工作,通常,这种函数用于使用malloc()释放已分配的内存。

       好了,运行程序,可以看到数据与上次输入的一致,说明数据确实存储了:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值