objective-c sqlite3 最原始的使用

本文介绍了一种在iOS应用中实现数据持久化的方法,通过SQLite数据库保存和读取UITextField中的数据,确保即使在应用程序退出后数据依然保留。

首先需要创建4个textfield,目的是把4个text存入到数据库中去,触发事件是在点击home键的时候。当再次进入到程序的时候再从数据库中读取text的值并显示。

然后命名之所以采用1234这种类型是因为遍历的时候比较方便

@property (nonatomic, retain) IBOutlet UITextField *field1;

@property (nonatomic, retain) IBOutlet UITextField *field2;

@property (nonatomic, retain) IBOutlet UITextField *field3;

@property (nonatomic, retain) IBOutlet UITextField *field4;

最后放上代码,有很详细的注释
#pragma mark -
- (void)viewDidLoad {
	//先转化
    //NSString *path=[self dataFilePath];
	//const char *pat=[path UTF8String];//const以后就不要再赋值了,常量
    if (sqlite3_open([[self dataFilePath] UTF8String], &database)!= SQLITE_OK) {//不是0就是错  
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");//如果是0, 失败,报错
    }
    
    char *errorMsg;
	//创建表语句
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";//设主键PRIMARY KEY
   //执行这个语句,使用sqlite3_exec的原因就是一执行就完事,没有后续操作了,但是查询语句就比较复杂
	if (sqlite3_exec (database, [createSQL  UTF8String],NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert1(0, @"Error creating table: %s", errorMsg);
    }
    //查询语句
    NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";
    sqlite3_stmt *statement;//缓冲地带,查询完的结果,放在这个缓冲池里
	//-1是不限长度
    if (sqlite3_prepare_v2( database, [query UTF8String],-1, &statement, nil) == SQLITE_OK) {
       //while按逐行循环取值,结束条件
		while (sqlite3_step(statement) == SQLITE_ROW) {
			/*************分别取出一行中不同列的值************/
			
			//从结果表中去出第1列的值,因为此列是int型,所以就用sqlite3_column_int
            int row = sqlite3_column_int(statement, 0);
			//从结果表中去出第2列的值,因为此列是char型,所以就用sqlite3_column_text第二列是text,类型要对应
            char *rowData = (char *)sqlite3_column_text(statement, 1);
            //把c的字符串转化为NSString,项目中取使用
            NSString *fieldName = [[NSString alloc]
                                   initWithFormat:@"field%d", row];
			//把c的字符串转化为NSString,项目中取使用.编码是utf8
            NSString *fieldValue = [[NSString alloc]
                                    initWithUTF8String:rowData];
            UITextField *field = [self valueForKey:fieldName];
            field.text = fieldValue;
            [fieldName release];
            [fieldValue release];
        }
		//把缓冲的结果表关闭掉
        sqlite3_finalize(statement);
    } 
    
    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationWillTerminate:)
                                                 name:UIApplicationWillTerminateNotification 
                                               object:app];
    [super viewDidLoad];
}

- (NSString *)dataFilePath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(

                                                         NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:kFilename];

}


//此方法完成对数据进行保存,把textField的值输入数据库
- (void)applicationWillTerminate:(NSNotification *)notification {
    for (int i = 1; i <= 4; i++)
    {
        NSString *fieldName = [[NSString alloc]
                               initWithFormat:@"field%d", i];
        UITextField *field = [self valueForKey:fieldName];
        [fieldName release];
        //错误提示
        char *errorMsg;
		//插入语句   .(?, ?)意思是先不说,以后再说
        char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);";
        sqlite3_stmt *stmt;
		//因为参数是?,需要滞后给"?"赋值,所以此处用sqlite3_prepare_v2
        if (sqlite3_prepare_v2(database, update, -1, &stmt,nil) == SQLITE_OK) {
			//给第一个问号赋值,第一个对应的位置的是row字段,所以用sqlite3_bind_int,bind是绑定
            sqlite3_bind_int(stmt, 1, i);//注意第一个问号从1开始的
			//给第二个问号赋值,第二个对应的位置的是FIRLD_DATA字段,所以用sqlite3_bind_text
            sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
        }
		//真正导致插入的地方
        if (sqlite3_step(stmt) != SQLITE_DONE)//不带大括号只管一行
            NSAssert1(0, @"Error updating table: %s",  errorMsg);//断言
        sqlite3_finalize(stmt);
    }
	//for循环执行完毕才关闭,数据库,说明彻底用完了,因为这个方法执行了说明结束了
    sqlite3_close(database);    
}


转载于:https://my.oschina.net/sunqichao/blog/102270

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值