标签:
SQLite3的实际应用
前面的文章中介绍了SQlite,并且介绍了他的各种语法及使用方法。
但是没有正在项目中使用特,今天就开始做一个小小的实例,就是使用SQLite3来实现数据库的相应操作并且把他应用到实际项目中去。
一:准备
首先新建好了一项目之后你需要在你的项目中带入libsql3.0.dylib这个库,当然libsql3.dylib也是一样的(目前他们到底有什么区别笔者还没有弄清楚,如果你知道可以分享一些,哈哈)。
二:环境
上面的步骤完成了之后,我们就开始先搭建一下环境,需求如下:
代码如下:
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
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4592070.html