IOS学习笔记15——SQLite数据库

来源:互联网 发布:戴尔面部识别软件 编辑:程序博客网 时间:2024/05/16 19:52

SQLite是MySQL的简化版,更多的运用与移动设备或小型设备上。SQLite的优点是具有可移植性,它不需要服务器就能运行,同时,它也存在一些缺陷,首先,没有提供简单的数据库创建方式,必须手工创建数据库,其次,SQLite没有面向对象接口,必须使用依赖于C语言代码的API。相对于OC,这套API既不那么优雅,也更难使用。当相比于用文件进行存储,还是更推荐使用SQLite进行数据存储。


下面来看下如何使用SQLite


工程目录如下:

首先建立一个Single View Application工程,命名为SQLite3Test,然后打开ViewController.xib文件,布局如下,并设置三个UITextField的tag分别为1、2、3

设置tag的地方在属性选择器中(xcode右边)



然后在ViewController.h文件中声明如下:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController@property(copy,nonatomic) NSString *databaseFilePath;//这个方法定义的是当应用程序退到后台时将执行的方法,按下home键执行(通知中心来调度)-(void)applicationWillResignActive:(NSNotification *)notification;//当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作-(IBAction)backgroundTapped:(id)sender;@end

接下来看下.m文件的具体实现,就不一一介绍了,在代码中会有注释

在开始写代码前,要导入SQLite支持包 libsqlite3.dylib(具体做法就不详述了)

上代码:

#import "ViewController.h"#import "sqlite3.h"//数据库文件的名字#define kDatabaseName @"database.sqlite3"@interfaceViewController ()@end@implementation ViewController@synthesize databaseFilePath;- (void)viewDidLoad{    [superviewDidLoad];        NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *documentDirectory = [path objectAtIndex:0];    //指定数据库文件的路径    self.databaseFilePath = [documentDirectory stringByAppendingPathComponent:kDatabaseName];        //打开数据库    sqlite3 *database;    //[self.databaseFilePath UTF8String];将OC字符串装换成C字符串    if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {        //关闭数据库        sqlite3_close(database);        NSAssert(0,@"数据库打开失败");    }            //创建表格    NSString *createSql = @"CREATE TABLE IF NOT EXISTS STUDENT (TAG INTEGER PRIMARY KEY ,FIELD_DATA TEXT);";    //若发生错误,则错误信息存在该字符串中    char *errorMsg;        //sqlite3_exec这个方法可以执行那些没有返回结果的操作,例如创建、插入、删除等,这个函数包含了sqlite3_prepare这个函数的操作,目的是将UTF-8格式的SQL语句转换为编译后的语句    if (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(0,@"创建表错误:%s", errorMsg);    }        //查询数据库    NSString *querySql = @"SELECT * FROM STUDENT ORDER BY TAG";    //语句句柄    sqlite3_stmt *statament;    //sqlite3_prepare_v2的作用是将UTF-8格式的SQL语句转换为编译后的语句,并返回指向该语句的指针    if (sqlite3_prepare_v2(database, [querySql UTF8String], -1, &statament, nil) == SQLITE_OK) {        //sqlite3_step的作用是在编译后的语句中向前移动一条记录,SQLITE_ROW代表一行        while (sqlite3_step(statament) == SQLITE_ROW) {            //返回当前这条记录中的一个int类型字段的值,下面sqlite3_column_text返回一个字符串类型的值,后面的数字对应每一列            int tag = sqlite3_column_int(statament, 1);            char *rowData = (char *)sqlite3_column_text(statament, 2);            //如果要得到一个NSString字符串,可以采用如下方法            //NSString *str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statament, 1)];                        //通过tag得到UI控件,类似Android中的findViewById(id)            UITextField *textField = (UITextField *)[self.viewviewWithTag:tag];                        //[[NSString alloc]initWithUTF8String:rowData] 将C字符串转换成OC字符串            textField.text = [[NSStringalloc]initWithUTF8String:rowData];        }        //删除编译后的语句        sqlite3_finalize(statament);    }    sqlite3_close(database);        //注册通知,当程序将要退到后台时执行applicationWillResignActive方法(在.h中定义)    UIApplication *application = [UIApplicationsharedApplication];    [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotificationobject:application];}- (void)viewDidUnload{    [superviewDidUnload];    // Release any retained subviews of the main view.}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);}//按下Home键程序将要进入后台前保存UITextField中的数据-(void)applicationWillResignActive:(NSNotification *)notification{    sqlite3 *database;    if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {        NSAssert(0,@"打开数据库错误");        sqlite3_close(database);    }        for (int i = 1; i <= 3; i++) {        UITextField *textField = (UITextField *)[self.viewviewWithTag:i];                //插入数据        char *update = "INSERT OR REPLACE INTO STUDENT VALUES (?,?)";        sqlite3_stmt *statement;        if (sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK) {            //将值保存到指定的列            sqlite3_bind_int(statement, 1, i);                        //第四个参数代表第三个参数中需要传递的长度。对于C字符串来说,-1表示传递全部字符串。第五个参数是一个回调函数,比如执行后做内存清除工作。            sqlite3_bind_text(statement, 2, [textField.textUTF8String], -1, NULL);        }                char *errorMsg = NULL;        //SQLITE_DONE代表更新数据库是否完成        if (sqlite3_step(statement) != SQLITE_DONE) {            NSAssert(0,@"更新数据出错:%s",errorMsg);        }        sqlite3_finalize(statement);    }        sqlite3_close(database);}-(IBAction)backgroundTapped:(id)sender{    /*当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作     设置步骤是打开.xib文件选中整个视图,然后将属性选择器中的class由UIView改成UIControl,然后在事件选取器中选择Touch Down事件并连线到.h文件中的backgroundTapped方法     */    for (int i = 1; i <= 3; i ++) {        UITextField *textField = (UITextField *)[self.viewviewWithTag:i];        [textField resignFirstResponder];    }}@end

最后运行效果如下,输入信息后按下Home键,然后再进入应用,可以看到数据在每次退出前都保存了,再次进入则从sqlite数据库查询保存的数据并显示在界面上



加入我们的QQ群或微信公众账号请查看:Ryan's zone公众账号及QQ群

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩守望先锋太卡怎么办 电脑玩游戏太卡怎么办 多肉植物枯萎了怎么办 lol被惩罚20分钟怎么办 密保手机换号了怎么办 丧尸危机爆发了怎么办 诛仙账号被盗了怎么办 诛仙3账号忘了怎么办 伤害世界车翻了怎么办 诛仙3没用的护符怎么办 灵跃武器选错了怎么办 qq账号不记得了怎么办 突然不来月经了怎么办 闭经2个月了怎么办 闭经怎么办我才19岁 闭经3 4个月怎么办 月经来了十多天了还不走怎么办 3个月没有来月经怎么办 48岁突然没月经怎么办 月经来了疼的厉害怎么办 月经肚子疼怎么办快速止疼 来月经疼的厉害怎么办 22岁闭经6个月怎么办 月经推迟16天了怎么办 月经半年没来了怎么办 月经推迟两个月了还不来怎么办 四个月月经不来怎么办 快两个月没来月经了怎么办 月经停了两个月怎么办 别人诬告我我该怎么办 有人造谣我我该怎么办 宝宝晚上不睡觉哭闹怎么办 婴儿晚上不睡觉哭闹怎么办 2月宝宝排便困难怎么办 3岁宝宝老是哭闹怎么办 2岁了囟门闭合晚怎么办 宝宝卤门闭合慢怎么办 手经常碰水脱皮怎么办 迅雷文件已移除怎么办 手机不读sd卡怎么办 g买卖卖错账号怎么办