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给我提供了两 ...
随机推荐
- bzoj3774
这算是最小割中比较难的吧 看到选取显然最小割 看到上下左右四个点我感觉肯定和染色相关 注意每个点的收益获得条件是[或],因此我们考虑拆点i', i,分别表示通过四周控制和控制本身的代价 连边s--&g ...
- 移动端web页面使用position:fixed问题
在做移动端项目时,碰到一个很纠结的问题,头部固定的问题,一开始使用fixed,发现一系列的问题, 问题1:footer输入框 focus 状态,footer 被居中,而不是吸附在软键盘上部. 测试环境 ...
- (一)学习JavaScript之setTimeout方法
参考:http://www.w3school.com.cn/jsref/met_win_settimeout.asp HTML DOM Window 对象 定义和用法 setTimeout() 方法用 ...
- 实用Python 语句集(入门者入)
1. Python IDLE中切换当前路径 在Python自带的编辑器IDLE中或者Python shell中不能使用cd命令,那么跳到目标路径呢. 方法是使用os包下的相关函数实现路径切换功能. i ...
- 【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...
- Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法
1.打开文件 vi filename 2.转到文件结尾 G 或转到第9行 9G 3.删除所有内容(先用G转到文件尾) ,使用: :1,.d 或者删除第9行到第200行的内容(先用200G转到第200行 ...
- viedeo
http://download.farsight.com.cn/download/Android.htm
- Tomcat 7 Connector 精读(2) CoyoteAdapter
这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类. 其中Service的重要任务就是讲客户端端请求交给容器. public void service(org.apache ...
- openCV 直方图统计
直方图显示 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc ...
- tomcat6-7配置管理用户
tomcat6: <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename=" ...