ios开发——实战OC篇&SQLite3的实际应用

SQLite3的实际应用

前面的文章中介绍了SQlite,并且介绍了他的各种语法及使用方法。

但是没有正在项目中使用特,今天就开始做一个小小的实例,就是使用SQLite3来实现数据库的相应操作并且把他应用到实际项目中去。

一:准备

首先新建好了一项目之后你需要在你的项目中带入libsql3.0.dylib这个库,当然libsql3.dylib也是一样的(目前他们到底有什么区别笔者还没有弄清楚,如果你知道可以分享一些,哈哈)。

二:环境

上面的步骤完成了之后,我们就开始先搭建一下环境,需求如下:

  • 两个文本框,并且设置输出口(IBOutelet)
  • 一个按钮设置动作(IBAction)
  • 最后在界面上放一个tableView,也需要设置他的输出口(IBOutlet)

代码如下:

1 @property (weak, nonatomic) IBOutlet UITextField *name;
2 @property (weak, nonatomic) IBOutlet UITextField *age;
3 - (IBAction)Add;
4
5 @property (weak, nonatomic) IBOutlet UITableView *tableView;

将上面的控件做相应的调整之后就会显示如下视图:

三:打开-创建数据库

在要实现的文件中倒入数据库:

1 #import <sqlite3.h>

创建一个数据库属性:

1 @property (nonatomic, assign) sqlite3 *db;

数据库打开与创建;

 1 /**     初始化数据库      */
 2 -(void)setUpDB
 3 {
 4     //数据库文件的路径
 5     NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"iCocos.sqlite"];
 6
 7     //打开数据库(链接)
 8     BOOL sqlOpen = sqlite3_open(path.UTF8String, &_db);
 9     if (sqlOpen == SQLITE_OK) {
10         NSLog(@"打开数据库成功");//NSAssert(YES, @"打开数据成功");
11
12         //创建表格
13         //SQL语句
14         const char *sql = "CREATE TABLE IF NOT EXISTS t_user (id integer PRIMARY KEY, name text NOT NULL, age real);";
15         char *err = NULL;
16         //执行创建表格语句
17         sqlite3_exec(self.db, sql, NULL, NULL, &err);
18         if (err) {
19             NSLog(@"创建表格失败 -- %s", err);
20         } else {
21             NSLog(@"创建表格成功");
22         }
23     } else {
24         NSLog(@"打开失败");
25     }
26
27     //sqlite3_close(db);
28 }

这里如果成功了你的沙盒中的Document中就会这样的文件

打开之后就可以看到里面有对应的属性(这里打开需要安装对应的额数据库软件)

四:数据库操作的实现

这里我们先建一个模型,用于存放Sqlite中数据的条数,

倒入模型

1 #import "Users.h"

并且在里面定义两个属性

1 @property (nonatomic, copy) NSString *name;

3 @property (nonatomic, copy) NSString *age;

创建一个用于存放模型数据的数组

1 @property (nonatomic, strong) NSMutableArray *users;

懒加载这个数组

1 //懒加载
2 -(NSMutableArray *)users
3 {
4     //如果为空
5     if (!_users) {
6         self.users = [[NSMutableArray alloc] init];
7     }
8     return _users;
9 }

实现点击增加按钮新增一条数据,并且在tableView上面做实时的显示

 1 //插入数据
 2 - (IBAction)Add {
 3     //插入数据库
 4     char *err = NULL;
 5     //SQL语句
 6     NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_user (name, age) VALUES (‘%@‘, %f);", self.name.text, self.age.text.doubleValue];
 7     //执行插入语句
 8     sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &err);
 9     if (err) {
10         NSLog(@"插入数据库失败 --- %s", err);
11     }
12
13     //初始化模型数据
14     Users *user = [[Users alloc] init];
15     user.name = self.name.text;
16     user.age = self.age.text;
17
18     //将模型数据
19     [self.users addObject:user];
20     //刷新表格
21     [self.tableView reloadData];
22 }

实现tableView的数据源方法使数据做相应的显示

 1 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 2 {
 3     return self.users.count;
 4 }
 5
 6 #pragma mark 每当有一个cell进入视野范围内就会调用,返回当前这行显示的cell
 7 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 8 {
 9     // 0.用static修饰的局部变量,只会初始化一次
10     static NSString *ID = @"cell";
11
12     // 1.拿到一个标识先去缓存池中查找对应的Cell
13     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
14
15     // 2.如果缓存池中没有,才需要传入一个标识创建新的Cell
16     if (cell == nil) {
17         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
18         cell.backgroundColor = [UIColor lightGrayColor];
19     }
20
21     //刷新数据
22     Users *user = self.users[indexPath.row];
23     cell.textLabel.text = user.name;
24     cell.detailTextLabel.text = user.age;
25
26
27     return cell;
28 }

显示后的界面如下:

为了更好的控制我们实现一个触摸屏幕推出键盘的方法

1 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 [self.view endEditing:YES]; 4 }

五:查询数据

为tableView的HeaderView设置一个SearchBar来实现搜索功能,设置Frame,设置代理并且实现它的代理方法

1     UISearchBar *search = [[UISearchBar alloc] init];
2     search.frame = CGRectMake(0, 0, 320, 44);
3     search.delegate = self;
4     self.tableView.tableHeaderView = search;

代理方法,(模糊)查询和显示

 1 //Searchbar代理方法
 2 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
 3 {
 4
 5     [self.users removeAllObjects];
 6
 7     //模糊查询
 8     //查询数据库
 9
10     //SQL语句
11     NSString *sql = [NSString stringWithFormat:@"SELECT name, age FROM t_user WHERE name LIKE ‘%%%@%%‘ OR age LIKE ‘%%%@%%‘;", searchText, searchText];
12     //执行查询语句
13     sqlite3_stmt *stmt = NULL;
14     int status = sqlite3_prepare_v2(self.db, sql.UTF8String, -1, &stmt, NULL);
15     if (status == SQLITE_OK) {
16         //查询数据成功
17         while (sqlite3_step(stmt) == SQLITE_ROW) { //使用while一条一条的执行
18             const char *name = (const char *)sqlite3_column_text(stmt, 0);
19             const char *age = (const char *)sqlite3_column_text(stmt, 1);
20
21             NSLog(@"Select %s, %s", name, age);
22
23
24             Users *user = [[Users alloc] init];
25             user.name = [NSString stringWithUTF8String:name];
26             user.age = [NSString stringWithUTF8String:age];
27
28             [self.users addObject:user];
29
30         }
31     }
32     [self.tableView reloadData];
33 }

上面通过所有直接模糊查询的,你也可以查询所有的数据

 1 /**     查询数据库     */
 2 -(void)selectDB
 3 {
 4     //查询数据库
 5
 6     //SQL语句
 7     const char *sql = "SELECT name, age FROM t_user;";
 8     //执行查询语句
 9     sqlite3_stmt *stmt = NULL;
10      int status = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL);
11     if (status == SQLITE_OK) {
12         //查询数据成功
13         while (sqlite3_step(stmt) == SQLITE_ROW) { //使用while一条一条的执行
14             const char *name = (const char *)sqlite3_column_text(stmt, 0);
15             const char *age = (const char *)sqlite3_column_text(stmt, 1);
16
17             NSLog(@"Select %s, %s", name, age);
18
19
20             Users *user = [[Users alloc] init];
21             user.name = [NSString stringWithUTF8String:name];
22             user.age = [NSString stringWithUTF8String:age];
23
24             [self.users addObject:user];
25
26         }
27     }
28 }

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

时间: 2024-08-04 14:42:24

ios开发——实战OC篇&SQLite3的实际应用的相关文章

iOS开发——实战OC篇&amp;环境搭建之Xib(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术编程的代码创建界面,本篇我们将介绍一个老的技术,但是在很多的公司或者库里面还是使用这个技术,既然如此它肯定有他的好处,至于好处这里我就不一一介绍了.在Xcode5之前是只能使用Xib或者代码的,而代码又对于很多初学者来说算是一个难题.毕竟不知道怎么下手.所以我就总结了一下这段时间自己编写程序的一个实例来说明怎么

iOS开发——实战OC篇&amp;环境搭建之纯代码(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleView Controller,命名未iCocos 二:由于我们使用的纯代码实现的,所以删除其中的StoryBoard和Viewtroller的两个文件 三:新建一个继承自TabBar Controller的类,我们命名问iCocos ViewController 三:在Appdelegate的实现文件中导入刚刚

iOS开发——实战OC篇&amp;环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)

环境搭建之StoryBoard(玩转UINavigationController与UITabBarController) 研究了这么就IOS开发,都没有所处一个像样或者自己忙一点的项目.最近自己正打算开始着手做一个项目,可是不知道怎么下手,感觉前面学了好多,可是回头想想却又很难下手,其中最主要的就是第一步环境的搭建,当然在这之前还有选题和素材,但是那些对于ios开发来说都不是技术上的问题或者在以后公司里面一半都不是我们所考虑的.所以今天开始我将以三篇简短但又实用的文章给大家介绍一下,怎么搭建一个

ios开发——实战OC篇&amp;FMDB详解

FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入,并使用 libsqlite3.dylib 依赖包. F

iOS开发——控制器OC篇&amp;UINavigationController&amp;UITabBarController详解

UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationController以栈的形式保存子控制器 @property(nonatomic,copy) NSArray *viewControllers; @property(nonatomic,readonly) NSArray *childViewControllers; 导航控制器之间的跳转: 使用push方法能将某个控制

iOS开发——实用技术OC篇&amp;单例模式的实实现(ACR&amp;MRC)

单例模式的实实现(ACR&MRC) 在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,Notification等, 那么这篇文章就简单介绍一下,我们开发中如果想要实现单例模式要怎么去实现! 单例模式顾名思义就是只有一个实例,它确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例.它经常用来做应用程序级别的共享资源控制.这个模式使用频率非常高,通过一个单例类,可以实现在不同窗口之间传递数

iOS开发——多线程OC篇&amp;(三)线程安全

线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 问题代码: 1 // 2 // YYViewController.m 3 // 05-线程安全 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase. All rights reserved

iOS开发——多线程OC篇&amp;GCD实用总结

GCD实用总结 图片下载 注:iOS开发中常见GCD的实用也就这些了, 先来看看之前我们经常使用的方式: 1 static NSOperationQueue * queue; 2 3 - (IBAction)someClick:(id)sender { 4 self.indicator.hidden = NO; 5 [self.indicator startAnimating]; 6 queue = [[NSOperationQueue alloc] init]; 7 NSInvocationO

iOS开发——多线程OC篇&amp;(一)多线程介绍

多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的串行 1个线程中任