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给我提供了两 ...
随机推荐
- C#调用Geocoding API进行地理编码与逆编码
使用C#调用Geocoding API来将地址转为经纬度,或者将经纬度转变为具体的地址. Geocoding API的详细介绍参见:http://developer.baidu.com/map/web ...
- UVa 294 (因数的个数) Divisors
题意: 求区间[L, U]的正因数的个数. 分析: 有这样一条公式,将n分解为,则n的正因数的个数为 事先打好素数表,按照上面的公式统计出最大值即可. #include <cstdio> ...
- 【转】Cocos2d-x 弹出对话框的设计与实现
转自:http://www.tairan.com/archives/4854 我们时常需要这么些功能,弹出一个层,给与用户一些提示,这也是一种模态窗口,在没有对当前对话框进行确认的时候,不能继续往下操 ...
- (Android Studio)ActionBar's Theme/Style [ActionBar主题风格修改]
(1)默认theme代码如下: 运行结果: 视觉效果:ActionBar为Dark,背景为Light. (2)将theme改为Light: 运行结果: 视觉效果:ActionBar和背景都为Light ...
- HDU5692 Snacks DFS+线段树
分析:一棵以1为根的有根树,然后每个点维护从根到当前节点的路径和,当修改一个点时 只会影响的子树的和,最优值也是子树最大的值 #include <cstdio> #include < ...
- 卡尔曼滤波器【Kalman Filter For Dummies】
搬砖到此: A Quick Insight As I mentioned earlier, it's nearly impossible to grasp the full meaning o ...
- PHP 实现短域名互转
/** * 短域名生成&解析类 */ class Build_URL { private $mem; private $base_url = 'http://xxx.com/'; public ...
- 设备扩展(DEVICE_EXTENSION)
原文链接:http://blog.csdn.net/hazy/article/details/481705 WDM中的结构 ---设备扩展 设备扩展(DEVICE_EXTENSION)是与设备对象 ...
- 【转载】setjmp和longjmp函数使用详解
[说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...
- HW5.27
public class Solution { public static void main(String[] args) { int totalCount = 0; int lineCount = ...