- 浏览: 518264 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8284135 作者:张燕广
实现的功能:1)演示使用sqlite3持久化数据。
关键词:数据持久化 sqlite3 数据库
1、将上一篇iPhone开发【二十二】数据持久化总结之第3篇归档(NSKeyedArchiver、NSKeyedUnarchiver)的工程拷贝一份,名称修改为Persistence-sqlite,工程结构如下:
[img]
[/img]
Person类已经没用了,可以删掉。
2、为工程添加sqlite3的库libsqlite3.dylib,如下图所示:
[img]
[/img]
3、主要修改了ViewController类,ViewController.h如下:
ViewController.m如下:
代码解释:
备注1:sqlite3_open():打开数据库
在操作数据库之前,首先要打开数据库。
这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。
第1个参数:数据文件路径必须用C风格字符串(不能用NSString),[filePath UTF8String]将filePath转换为C风格字符串。
第2个参数:是返回的数据库连接对象。
备注2:sqlite3_exec():执行SQL语句
第1个参数:数据库指针,是前面open函数得到的指针
第2个参数:const char *sql是一条sql 语句,以\0结尾。
第3个参数:sqlite3_callback 是回调,当这条语句执行之后,sqlite3会调用这个回调函数。
第4个参数:void*是一个指针,可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL
备注3:sqlite3_prepare_v2():将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针
第1个参数:数据库指针,是前面open函数得到的指针
第2个参数:sql语句,必须是C风格字符串
第3个参数:如果该参数小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止
第4个参数:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
备注4:sqlite3_step()
这个过程用于执行有前面sqlite3_prepare创建的准备语句。这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()直到这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回
备注5:sqlite3_column_text()
从结果集中获取各列的值,需要注意的是:第一列的索引是0。
备注6:sqlite3_finalize()
这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。
在空指针上调用这个函数没有什么影响,同时可以在准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用
sqlite_reset之后,或者在sqlite3_step任何调用之后。
备注7:sqlite3_close()
关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放掉。
备注8:sqlite3_bind_text()
第1个参数:指向在sqlite3_prepare_v2()调用中使用的sqlite3_stme。
第2个参数:所绑定的变量的索引(sql语句中第一个问号的索引),需要注意的是:第一个问号的索引是1,而不是0。
第3个参数:只有少数绑定函数,比如用于绑定文本或二进制数据的绑定函数,这个参数用来设定传递数据的长度。对于C字符串,可以传递-1来代替字符串的长度,意思是要是要使用整个字符串。
第4个参数:回调函数,一般用于在语句执行后做内存清理相关的工作。可以设置为NULL。
4、数据库文件的保存位置是: /Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/CC47C118-7FE7-4718-A4AA-635FBCC36AED/Documents/data.db3
[img]
[/img]
实现的功能:1)演示使用sqlite3持久化数据。
关键词:数据持久化 sqlite3 数据库
1、将上一篇iPhone开发【二十二】数据持久化总结之第3篇归档(NSKeyedArchiver、NSKeyedUnarchiver)的工程拷贝一份,名称修改为Persistence-sqlite,工程结构如下:
[img]
[/img]
Person类已经没用了,可以删掉。
2、为工程添加sqlite3的库libsqlite3.dylib,如下图所示:
[img]
[/img]
3、主要修改了ViewController类,ViewController.h如下:
#define kFileName @"archive" #define kDataKey @"Data" #define kSqliteFileName @"data.db3" #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property(nonatomic,retain)IBOutlet UITextField *name; @property(nonatomic,retain)IBOutlet UITextField *gender; @property(nonatomic,retain)IBOutlet UITextField *age; @property(nonatomic,retain)IBOutlet UITextField *education; -(NSString *)dataFilePath; -(void)applicationWillResignActive:(NSNotification *)nofication; @end
ViewController.m如下:
#import "ViewController.h" #import "Person.h" #import <sqlite3.h> @implementation ViewController @synthesize name,gender,age,education; -(NSString *)dataFilePath{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString *documentsDirectory = [paths objectAtIndex:0]; //return [documentsDirectory stringByAppendingPathComponent:kFileName]; return [documentsDirectory stringByAppendingPathComponent:kSqliteFileName]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { // Do any additional setup after loading the view, typically from a nib. NSString *filePath = [self dataFilePath]; NSLog(@"filePath=%@",filePath); if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){ //属性列表 /* NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath]; name.text = [array objectAtIndex:0]; gender.text = [array objectAtIndex:1]; age.text = [array objectAtIndex:2]; education.text = [array objectAtIndex:3]; [array release];*/ //归档 /* NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[self dataFilePath]]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data]; Person *person = [unarchiver decodeObjectForKey:kDataKey]; [unarchiver finishDecoding]; name.text = person.name; gender.text = person.gender; age.text = person.age; education.text = person.education; [unarchiver release]; [data release];*/ //sqlite3 sqlite3 *database; //打开数据库 if(sqlite3_open([filePath UTF8String], &database)!=SQLITE_OK){//备注1 //数据库打开失败,关闭数据库 sqlite3_close(database); NSAssert(0,@"打开数据库失败"); } char* errorMsg; NSString *createSQL = @"CREATE TABLE IF NOT EXISTS PERSON (name TEXT PRIMARY KEY,gender TEXT,age TEXT,education TEXT);"; //创建表 if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK){//备注2 //创建表失败,关闭数据库 sqlite3_close(database); NSAssert1(0, @"创建表失败:%s", errorMsg); } //查询表 NSString *querySQL = @"SELECT name,gender,age,education FROM PERSON ORDER BY name"; //执行查询,遍历查询结果 sqlite3_stmt *statment; if(sqlite3_prepare_v2(database, [querySQL UTF8String], -1, &statment, nil) == SQLITE_OK){//备注3 //查询成功,执行遍历操作 while(sqlite3_step(statment) == SQLITE_ROW){//备注4 const char* pName = (char*)sqlite3_column_text(statment, 0);//备注5 if(pName!=NULL){ self.name.text = [[NSString alloc]initWithUTF8String:pName]; } char* pGender = (char*)sqlite3_column_text(statment, 1); if(pGender!=NULL){ self.gender.text = [[NSString alloc]initWithUTF8String:pGender]; } char* pAge = (char*)sqlite3_column_text(statment, 2); if(pAge!=NULL){ self.age.text = [[NSString alloc]initWithUTF8String:pAge]; } char* pEducation = (char*)sqlite3_column_text(statment, 3); if(pEducation!=NULL){ self.education.text = [[NSString alloc]initWithUTF8String:pEducation]; } } sqlite3_finalize(statment);//备注6 } //关闭数据库 sqlite3_close(database);//备注7 } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } -(void)applicationWillResignActive:(NSNotification *)nofication{ //属性列表 /* NSMutableArray *array = [[NSMutableArray alloc]init]; [array addObject:name.text]; [array addObject:gender.text]; [array addObject:age.text]; [array addObject:education.text]; [array writeToFile:[self dataFilePath] atomically:YES]; [array release];*/ //归档 /* Person *person = [[Person alloc]init]; person.name = name.text; person.gender = gender.text; person.age = age.text; person.education = education.text; NSMutableData *data = [[NSMutableData alloc]init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; [archiver encodeObject:person forKey:kDataKey]; [archiver finishEncoding]; [data writeToFile:[self dataFilePath] atomically:YES]; [person release]; [archiver release]; [data release];*/ //sqlite3 sqlite3 *database; //打开数据库 if(sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK){ //数据库打开失败,关闭数据库 sqlite3_close(database); NSAssert(0,@"打开数据库失败"); } char* errorMsg; NSString *updateSQL = @"INSERT OR REPLACE INTO PERSON(name,gender,age,education) VALUES(?,?,?,?);"; //执行插入或更新操作 sqlite3_stmt *statment; if(sqlite3_prepare_v2(database, [updateSQL UTF8String], -1, &statment, nil) == SQLITE_OK){ //绑定变量 sqlite3_bind_text(statment, 1, [self.name.text UTF8String], -1, NULL);//备注8 sqlite3_bind_text(statment, 2, [self.gender.text UTF8String], -1, NULL); sqlite3_bind_text(statment, 3, [self.age.text UTF8String], -1, NULL); sqlite3_bind_text(statment, 4, [self.education.text UTF8String], -1, NULL); } if(sqlite3_step(statment)!=SQLITE_DONE){ NSAssert1(0, @"更新表失败:%s", errorMsg); } sqlite3_finalize(statment); //关闭数据库 sqlite3_close(database); } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; self.name = nil; self.gender = nil; self.age = nil; self.education = nil; } -(void)dealloc{ [name release]; [gender release]; [age release]; [education release]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } @end
代码解释:
备注1:sqlite3_open():打开数据库
在操作数据库之前,首先要打开数据库。
这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。
第1个参数:数据文件路径必须用C风格字符串(不能用NSString),[filePath UTF8String]将filePath转换为C风格字符串。
第2个参数:是返回的数据库连接对象。
备注2:sqlite3_exec():执行SQL语句
第1个参数:数据库指针,是前面open函数得到的指针
第2个参数:const char *sql是一条sql 语句,以\0结尾。
第3个参数:sqlite3_callback 是回调,当这条语句执行之后,sqlite3会调用这个回调函数。
第4个参数:void*是一个指针,可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL
备注3:sqlite3_prepare_v2():将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针
第1个参数:数据库指针,是前面open函数得到的指针
第2个参数:sql语句,必须是C风格字符串
第3个参数:如果该参数小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止
第4个参数:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
备注4:sqlite3_step()
这个过程用于执行有前面sqlite3_prepare创建的准备语句。这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()直到这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回
备注5:sqlite3_column_text()
从结果集中获取各列的值,需要注意的是:第一列的索引是0。
备注6:sqlite3_finalize()
这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。
在空指针上调用这个函数没有什么影响,同时可以在准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用
sqlite_reset之后,或者在sqlite3_step任何调用之后。
备注7:sqlite3_close()
关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放掉。
备注8:sqlite3_bind_text()
第1个参数:指向在sqlite3_prepare_v2()调用中使用的sqlite3_stme。
第2个参数:所绑定的变量的索引(sql语句中第一个问号的索引),需要注意的是:第一个问号的索引是1,而不是0。
第3个参数:只有少数绑定函数,比如用于绑定文本或二进制数据的绑定函数,这个参数用来设定传递数据的长度。对于C字符串,可以传递-1来代替字符串的长度,意思是要是要使用整个字符串。
第4个参数:回调函数,一般用于在语句执行后做内存清理相关的工作。可以设置为NULL。
4、数据库文件的保存位置是: /Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/CC47C118-7FE7-4718-A4AA-635FBCC36AED/Documents/data.db3
[img]
[/img]
发表评论
-
新风作浪博客学习(十九)在iOS虚拟键盘上添加动态隐藏按钮
2013-06-08 09:19 823为了给用户比较良好的交付,想在键盘上添加一个按钮,实时根据键盘 ... -
新风作浪博客学习(十八)openURL的使用(iOS调用系统电话、浏览器、地图、邮件等) .
2013-06-08 09:19 936今天遇见一行代码实现打开一个网页,比起印象里的UIWebVie ... -
新风作浪博客学习(十七)UIImageView响应点击事件 .
2013-06-08 09:19 670有时候会遇到点击一张图片,然后让这张图片触发一个事件,或者是跳 ... -
新风作浪博客学习(十六)Navigation + Tab Bar 常用组合框架 .
2013-06-07 08:50 1194看到很多项目中都采用的是Navigation加Tab Bar组 ... -
新风作浪博客学习(十五)google地图定位小Demo .
2013-06-07 08:50 1062[img][/img]今天写的是一个简单功能的google地图 ... -
新风作浪博客学习(十四)怎样向iPhone模拟器中添加图片 .
2013-06-07 08:50 745在我们做项目中可能需要使用图库,模拟器是有图库的,但是如何像其 ... -
新风作浪博客学习(十三)表视图的分组分区和索引分区 .
2013-06-07 08:50 750本次实现的是表视图的分区和索引,代码和前面都差不多,主要还是代 ... -
新风作浪博客学习(十二)代码实现UITableViewCell表视图单元定制 .
2013-06-07 08:49 937通常情况下我们会希望单元格UITableViewCell显示自 ... -
新风作浪博客学习(十一)UITableViewCell的标记、移动、删除、插入 .
2013-06-06 09:15 1065这篇文章是建立在 代码实现 UITableView与UITa ... -
新风作浪博客学习(十)代码实现 UITableView与UITableViewCell .
2013-06-06 09:14 1118我们常用的表格类视图就是用 UITableView与UITab ... -
新风作浪博客学习(九)两个UIPickerView控件间的数据依赖 .
2013-06-06 09:14 1042本篇实现功能是两个选取器的关联操作,滚动第一个滚轮第二个滚 ... -
新风作浪博客学习(八)代码实现UIPickerView .
2013-06-06 09:14 1248先说一下当个组件选取器,我们创建一个数组NSAray来保存选取 ... -
新风作浪博客学习(七)代码 实现UIDatePicker控件 和 Tab Bar 视图切换 .
2013-06-06 09:15 1078感觉代码写控件都一个理,先在ViewDidLoad中创建控件对 ... -
新风作浪博客学习(六)ios 视图切换翻页效果 .
2013-06-05 11:18 1030本文写的是视图切换,涉及到的内容有 1.实现代码添加Navi ... -
新风作浪博客学习(五)代码实现UISlider 和 UISwitch .
2013-02-18 09:15 1077本次实现的UISlider和UISwi ... -
新风作浪博客学习(四)把plist里数据显示在textField上 .
2013-02-18 09:15 887在代码实现Lable 、textFie ... -
新风作浪博客学习(三)NSBundle读取图片 plist文件和txt文件
2013-02-18 09:15 1641本文想简单介绍一下NSBundle读取图片到视图上,读取pli ... -
新风作浪博客学习(二)代码实现Lable 、textField创建界面以及键盘的处理
2013-02-18 09:15 1140今天写的是用代码实现一个简单界面,代码重复率比较高,可读性不是 ... -
新风作浪博客学习(一)plist文件读写操作
2013-02-18 09:14 1311文件plist 全名Property List,属性列表文件, ... -
GCDiscreetNotificationView提示视图
2013-06-05 11:17 531先看一下效果图: [img] ...
相关推荐
使用wxsqlite3提供的加密动态库,通过sqlite simple delphi包装类连接sqlite3.dll,自己扩展了sqlite simple delphi包装类,方便Delphi调用,还增加了CheckDbIsEncrypt函数,判断数据库有没有加密。具体使用请参考...
SQLite.Interop.dll 32和64位文件,配合SQLite Expert Professional 4.2可以打开加密数据库。 将SQLite.Interop.dll拷贝到SQLite Expert安装路径,然后打开SQLite Expert,Tools --> Options --> SQLite Library中...
gcc使用的sqlite3数据库,sqlite3.a ,可以用于Dev-C++,也可以用于Windows下使用gcc编译的程序,sqlite版本是:3270200,还包含了sqlite3.lib库文件,可以用于visual studio。
在学习的过程中遇到了配置问题是主要的,能得找bug找了大半天,但是还是坚持的心态把问题给解决了,比如需要哪几个文件,需要sqlite3.dll、sqlite3.lib、sqlite3i.h、sqlite3.hDbsqlite.h、Dbsqlite.cpp这些都是已经...
SQLite.Interop.dll for sqlite expert professional 4.2 用与SQLite Expert打开本地已加密的数据库的插件。1.将SQLite.Interop.dll x86拷贝到SQLite Expert安装路径(如:x:\Program Files (x86)\SQLite Expert\...
安卓Android sqlite万能数据库.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
基于ARM-Linux实现SQLite嵌入式数据库.pdf
Android实验报告Sqlite数据库操作.pdf
inux下c语言操作sqlite3数据库,有sqlite3动态库、sqlite3的源码安装包、c语言操作sqlite3数据库的封装函数。C语言能够正常对sqlite3进行增、删、改、查操作。
sqlite本地数据库,windows环境下的vs的demo,C++ api, 欢迎对windows环境下开发数据库感兴趣的朋友进行下载。
SQLite.Interop.dll for sqlite expert professional 4.2 用与SQLite Expert打开本地已加密的数据库的插件。适用32位和64位。 1.直接将下载的文件复制到SQLite Expert安装路径(如:c:\Program Files (x86)\SQLite ...
易语言源码易语言将access数据库导入sqlite数据库源码.rar 易语言源码易语言将access数据库导入sqlite数据库源码.rar 易语言源码易语言将access数据库导入sqlite数据库源码.rar 易语言源码易语言将access数据库...
易语言模块Sqlite数据库加强.rar 易语言模块Sqlite数据库加强.rar 易语言模块Sqlite数据库加强.rar 易语言模块Sqlite数据库加强.rar 易语言模块Sqlite数据库加强.rar 易语言模块Sqlite数据库加强.rar
源码调用sqlite3.dll接口API实现SQLite3数据库操作。Tags:sqlite3。
lua修改和查看数据库必须的so库,x86和arm的都有
第九节 用SQLite管理数据库.docx
python模块之sqlite数据库.pdf
rails升级到2.0.2之后默认使用sqlite3作为数据库. 解压后把sqlite3.def、sqlite3.dll复制到Ruby安装目录bin文件夹下. 版本:sqlitedll-3_6_21
php读取SQLite数据库, php读取SQLite数据库,php读取SQLite数据库
在调试Android上层系统时,经常需要改动到跟数据库相关的参数,光有SQL语句使用知识毫无用处,好在Android命令行下有sqlite3命令,而现在系统的应用会把数据保存到/data/data/包名/database/目录下,该目录下会有.db...