ios开发——实战OC篇&SQLite3的实际应用
SQLite3的实际应用
前面的文章中介绍了SQlite,并且介绍了他的各种语法及使用方法。
但是没有正在项目中使用特,今天就开始做一个小小的实例,就是使用SQLite3来实现数据库的相应操作并且把他应用到实际项目中去。
一:准备
首先新建好了一项目之后你需要在你的项目中带入libsql3.0.dylib这个库,当然libsql3.dylib也是一样的(目前他们到底有什么区别笔者还没有弄清楚,如果你知道可以分享一些,哈哈)。
二:环境
上面的步骤完成了之后,我们就开始先搭建一下环境,需求如下:
- 两个文本框,并且设置输出口(IBOutelet)
- 一个按钮设置动作(IBAction)
- 最后在界面上放一个tableView,也需要设置他的输出口(IBOutlet)
代码如下:
@property (weak, nonatomic) IBOutlet UITextField *name; @property (weak, nonatomic) IBOutlet UITextField *age; - (IBAction)Add; @property (weak, nonatomic) IBOutlet UITableView *tableView;
将上面的控件做相应的调整之后就会显示如下视图:
三:打开-创建数据库
在要实现的文件中倒入数据库:
#import <sqlite3.h>
创建一个数据库属性:
@property (nonatomic, assign) sqlite3 *db;
数据库打开与创建;
/** 初始化数据库 */ -(void)setUpDB { //数据库文件的路径 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"iCocos.sqlite"]; //打开数据库(链接) BOOL sqlOpen = sqlite3_open(path.UTF8String, &_db); if (sqlOpen == SQLITE_OK) { NSLog(@"打开数据库成功");//NSAssert(YES, @"打开数据成功"); //创建表格 //SQL语句 const char *sql = "CREATE TABLE IF NOT EXISTS t_user (id integer PRIMARY KEY, name text NOT NULL, age real);"; char *err = NULL; //执行创建表格语句 sqlite3_exec(self.db, sql, NULL, NULL, &err); if (err) { NSLog(@"创建表格失败 -- %s", err); } else { NSLog(@"创建表格成功"); } } else { NSLog(@"打开失败"); } //sqlite3_close(db); }
这里如果成功了你的沙盒中的Document中就会这样的文件
打开之后就可以看到里面有对应的属性(这里打开需要安装对应的额数据库软件)
四:数据库操作的实现
这里我们先建一个模型,用于存放Sqlite中数据的条数,
倒入模型
#import "Users.h"
并且在里面定义两个属性
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *age;
创建一个用于存放模型数据的数组
@property (nonatomic, strong) NSMutableArray *users;
懒加载这个数组
//懒加载 -(NSMutableArray *)users { //如果为空 if (!_users) { self.users = [[NSMutableArray alloc] init]; } return _users; }
实现点击增加按钮新增一条数据,并且在tableView上面做实时的显示
//插入数据 - (IBAction)Add { //插入数据库 char *err = NULL; //SQL语句 NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_user (name, age) VALUES ('%@', %f);", self.name.text, self.age.text.doubleValue]; //执行插入语句 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &err); if (err) { NSLog(@"插入数据库失败 --- %s", err); } //初始化模型数据 Users *user = [[Users alloc] init]; user.name = self.name.text; user.age = self.age.text; //将模型数据 [self.users addObject:user]; //刷新表格 [self.tableView reloadData]; }
实现tableView的数据源方法使数据做相应的显示
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.users.count; } #pragma mark 每当有一个cell进入视野范围内就会调用,返回当前这行显示的cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 0.用static修饰的局部变量,只会初始化一次 static NSString *ID = @"cell"; // 1.拿到一个标识先去缓存池中查找对应的Cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 2.如果缓存池中没有,才需要传入一个标识创建新的Cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; cell.backgroundColor = [UIColor lightGrayColor]; } //刷新数据 Users *user = self.users[indexPath.row]; cell.textLabel.text = user.name; cell.detailTextLabel.text = user.age; return cell; }
显示后的界面如下:
为了更好的控制我们实现一个触摸屏幕推出键盘的方法
-( }
五:查询数据
为tableView的HeaderView设置一个SearchBar来实现搜索功能,设置Frame,设置代理并且实现它的代理方法
UISearchBar *search = [[UISearchBar alloc] init]; search.frame = CGRectMake(, , , ); search.delegate = self; self.tableView.tableHeaderView = search;
代理方法,(模糊)查询和显示
//Searchbar代理方法 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self.users removeAllObjects]; //模糊查询 //查询数据库 //SQL语句 NSString *sql = [NSString stringWithFormat:@"SELECT name, age FROM t_user WHERE name LIKE '%%%@%%' OR age LIKE '%%%@%%';", searchText, searchText]; //执行查询语句 sqlite3_stmt *stmt = NULL; , &stmt, NULL); if (status == SQLITE_OK) { //查询数据成功 while (sqlite3_step(stmt) == SQLITE_ROW) { //使用while一条一条的执行 ); ); NSLog(@"Select %s, %s", name, age); Users *user = [[Users alloc] init]; user.name = [NSString stringWithUTF8String:name]; user.age = [NSString stringWithUTF8String:age]; [self.users addObject:user]; } } [self.tableView reloadData]; }
上面通过所有直接模糊查询的,你也可以查询所有的数据
/** 查询数据库 */ -(void)selectDB { //查询数据库 //SQL语句 const char *sql = "SELECT name, age FROM t_user;"; //执行查询语句 sqlite3_stmt *stmt = NULL; , &stmt, NULL); if (status == SQLITE_OK) { //查询数据成功 while (sqlite3_step(stmt) == SQLITE_ROW) { //使用while一条一条的执行 ); ); NSLog(@"Select %s, %s", name, age); Users *user = [[Users alloc] init]; user.name = [NSString stringWithUTF8String:name]; user.age = [NSString stringWithUTF8String:age]; [self.users addObject:user]; } } }
shixan查询之后的显示界面
注:上面只是实现了数据库的打开,创建,增加,查询,并没有处理删除,这里说一下思路,关于删除你可能是删除数据库也可能只是删除tableView上面显示的数据,但是这样的话数据库的数据还是存在。
希望本文能够对你有益,有错误的地方也希望能指正,
最后附上上面源码的下载地址:http://d.cocoachina.com/code/detail/307648/%E6%95%B0%E6%8D%AE%E5%BA%93SQLITE%E7%9A%84%E5%BA%94%E7%94%A8/
后面将会结束一个操作数据库的很有名的框架——FMDB
ios开发——实战OC篇&SQLite3的实际应用的更多相关文章
- iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术 ...
- iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleV ...
- iOS开发——实战OC篇&环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)
环境搭建之StoryBoard(玩转UINavigationController与UITabBarController) 研究了这么就IOS开发,都没有所处一个像样或者自己忙一点的项目.最近自 ...
- ios开发——实战OC篇&FMDB详解
FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...
- iOS开发——控制器OC篇&UINavigationController&UITabBarController详解
UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationControl ...
- iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)
单例模式的实实现(ACR&MRC) 在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,No ...
- iOS开发——图层OC篇&UIColor深入研究(CGColor,CIColor)
UIColor深入研究(CGColor,CIColor) 由于跟人比较喜欢研究关于图层与动画方面的技术,正打算看看别人写的好东西,就遇到了好几个问题, 第一:UIClor类方法的使用 就是关于UICo ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- iOS开发——多线程OC篇&多线程总结
多线程总结 //1.NSThread /** 优点:NSThread 比其他两个轻量级. 缺点:需要自己管理线程的生命周期,线程同步,线程同步时对数据的加锁会有一定的系统开销. cocoa给我提供了两 ...
随机推荐
- mvc源码解读(20)-controller和view之查找view
很多时候在mvc项目中我们需要去扩展自己的视图引擎,大概看起来应该下面这个样子的: public class RazorEngineExpand : RazorViewEngine { private ...
- 在ASP.NET MVC中使用DropDownList
在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性H ...
- ZOJ 3264 Present for MM
寒假开始了···但是做题没有结束嘤··· 然后是dp专场嘤··· 题意:背包问题,给出背包容量和物品对数,每对物品都有特殊的关系:第一种关系是两个物品都取有价值,若只取一个则失去价值:第二种是两个物品 ...
- POJ 2243 Knight Moves
Knight Moves Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13222 Accepted: 7418 Des ...
- MAC虚拟机NAT方式共享上网设置
有部分FY需要,我写一下我的方法吧,当初安装完MAC后,无法上网,网络搜索用的是HOST-only方法,试了几次都没有成功,后来尝试NAT方法,发现很简单. 我的主机系统:win7 64位,自动获取I ...
- codeforces 629D 树状数组+LIS
题意:n个圆柱形蛋糕,给你半径 r 和高度 h,一个蛋糕只能放在一个体积比它小而且序号小于它的蛋糕上面,问你这样形成的上升序列中,体积和最大是多少 分析:根据他们的体积进行离散化,然后建树状数组,按照 ...
- <转>LeetCode 题目总结/分类
原链接:http://blog.csdn.net/yangliuy/article/details/44514495 注:此分类仅供大概参考,没有精雕细琢.有不同意见欢迎评论~ 利用堆栈:http:/ ...
- prefuse学习(一)用非数据库连接和xml的方式读入数据
prefuse正常的数据源需要从ConnectionFactory中生产出来,但是如果平时不想用里面给的方法得到数据,就需要手动创造Graph里面所需要的内容两个Table 下面是我自己写的从文件中读 ...
- CP-ABE环境配置
本环境配置步骤参考互联网: 1.安装m4 sudo apt-get install m4 2.安装gmphttp://gmplib.org/ 下载gmplib ./configure make ma ...
- 独树一帜的字符串匹配算法——RK算法
参加了雅虎2015校招,笔试成绩还不错,谁知初面第一题就被问了个字符串匹配,要求不能使用KMP,但要和KMP一样优,当时瞬间就呵呵了.后经过面试官的一再提示,也还是没有成功在面试现场写得.现将该算法记 ...