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给我提供了两 ...
随机推荐
- bzoj2757
非常神的数位dp,我调了几乎一天首先和bzoj3131类似,乘积是可以预处理出来的,注意这里乘积有一个表示的技巧因为这里质因数只有2,3,5,7,所以我们可以表示成2^a*3^b*5^c*7^d,也就 ...
- poj2828
很容易想到一种动态的做法:平衡树…… 或者是二分+树状数组 但,前者编程复杂度较大,而且据说会被卡(没试过):后者理论上超时(据说可以擦边过?): 所以要尝试新的算法: 倒着考虑,显然最后一个对象的位 ...
- webstorm使用教程之 使用github
详细说下webstorm下设置,首先确认webstorm是否为最新版,然后点击(file->setting->github) 填完后点击test,确保畅通... 点击以后会出现弹出框,会让 ...
- 【 D3.js 选择集与数据详解 — 5 】 处理模板的应用
在[选择集与数据 - 4]一文中,介绍了一个update.enter.exit的处理模板,这个模板很常用,本文将通过一个例子来讲解其使用方法. 1. 模板 复习一下上一章提到的模板. //绑定数据后, ...
- 【转】忙里偷闲写的小例子---读取android根目录下的文件或文件夹
原文网址:http://www.cnblogs.com/wenjiang/p/3140055.html 最近几天真的是各种意义上的忙,忙着考试,还要忙着课程设计,手上又有外包的项目,另一边学校的项目还 ...
- MS-SQL索引类型
一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程序迅速地找到表中的 ...
- Python脚本控制的WebDriver 常用操作 <五> 访问链接
下面将使用webdriver来访问一个web链接 测试用例场景 测试中,经常会点击几个链接来进行操作,所以访问链接是基本的常见操作 Python脚本 from selenium import webd ...
- vim讲解
文本编辑vi使用 最好使用vim,采用sudo apt-get install vim vi是Linux及类Unix系统中主流的命令行文本编辑器,功能极为强大,vim是增强版本的vim.Vim的高级地 ...
- lcov收集覆盖率
1.gcov 1.1 什么是gcov 首先我们要了解什么是gcov,gcov伴随gcc 发布.gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用 ...
- linux tar打包
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...