1.添加依赖框架:
1)点击项目,BP,LWL,加号:
2)libsqlite3:
3.声明数据库和UI控件:
4.创建UI:
1)在默认ViewController上添加两个文本框和一个按钮。然后为VC添加NC:
2)添加一组新的NC,和上一组附加到同一个工具条:
3)关联原ViewController的UI:
5.实现数据库创建和数据插入:
//// CVUViewController.m// 0719-Sqlite//// Created by vigiles on 13-7-19.// Copyright (c) 2013年 vigiles. All rights reserved.//#import "CVUViewController.h"@interface CVUViewController ()@end@implementation CVUViewController/* 在视图加载时创建数据库和UI */- (void)viewDidLoad{ [super viewDidLoad]; NSArray * arrDoc; //路径阵列-数组 NSString * strDoc; //定义数据库路径 // 获取documents(我的文档)目录所在的路径阵列 arrDoc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // 因为是获取document目录,只返回一个。so,取索引0 strDoc = [arrDoc objectAtIndex:0]; // 构造数据库文件的保存路径和名称 dbPath = [[NSString alloc] initWithString:[strDoc stringByAppendingPathComponent:@"user.sqlite"]]; // 文件管理器,用于管理/删除/复制文件, NSFileManager * fm = [NSFileManager defaultManager]; // 如果数据库不存在,即尚未创建。SQLite的策略是如果有就打开,如果没有就创建 if([fm fileExistsAtPath:dbPath] == NO) { // 数据库编码 const char * dbEncoded = [dbPath UTF8String]; // 创建,并打开数据库 if (sqlite3_open(dbEncoded, &dbUser) == SQLITE_OK) { //错误信息 char * charErrMsg; //SQL语句=如果不存在就创建tbuser数据库(字段 类型,字段 类型)。不区分大小写 const char * sqlCreateTb ="create table if not exists TbUser (name text, id text)"; // 创建数据表 if(sqlite3_exec(dbUser, sqlCreateTb, NULL, NULL, &charErrMsg) != SQLITE_OK){ NSLog(@"创建表单失败了!"); } // 关闭数据库 sqlite3_close(dbUser); NSLog(@"创建数据库或打开成功:%@",dbPath);//打印出字符串路径 } else { NSLog(@"创建/打开数据库失败了!"); } } else { // [fm removeItemAtPath:dbPath error:nil];//删除文件; // NSLog(@"数据库文件已删除"); } }/* 向数据库添加数据 */-(IBAction)doAddData{ //定义错误的指针,保存错误信息 char * charErrMsg; //数据库字符编码 const char * dbEncoded = [dbPath UTF8String]; //打开数据库 if(sqlite3_open(dbEncoded, &dbUser) == SQLITE_OK) { //创建插入语句 NSString * strSqlInsert = [NSString stringWithFormat:@"insert into TbUser(name, id) values(\"%@\", \"%@\")", self.tfName.text, self.tfId.text]; //创建Sqlite语句。UTF8编码 const char * charSqlInsert= [strSqlInsert UTF8String]; //执行SQL语句 if (sqlite3_exec(dbUser, charSqlInsert, NULL, NULL, &charErrMsg) == SQLITE_OK) { //执行成功后清空文本框 self.tfName.text= @""; self.tfId.text = @""; } else { NSLog(@"插入记录错误: %s", charErrMsg); sqlite3_free(charErrMsg);//释放错误指针 } sqlite3_close(dbUser);//关闭数据库 }}/* 关闭虚拟键盘 */-(IBAction)doHideKey{ [self.tfName resignFirstResponder]; [self.tfId resignFirstResponder];}@end
6.创建数据封装对象:
1)创建OC文件:
2)继承自基类:
3)声明数据变量:
7.创建显示数据的表单类:
1)OC文件:
2)继承UITableViewController:
3)声明数据变量:
8.实现数据显示:
这里又用到了对表单的操作。
//// TabShowData.m// SqliteTest//// Created by vigiles on 13-7-19.// Copyright (c) 2013年 vigiles. All rights reserved.//#import "TabShowData.h"@interface TabShowData ()@end@implementation TabShowData- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"加载显示页面"); NSArray * arrDocShow; //路径阵列-数组 NSString * strDocShow; //定义数据库路径 // 获取documents(我的文档)目录所在的路径阵列 arrDocShow = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // 因为是获取document目录,只返回一个。so,取索引0 strDocShow = [arrDocShow objectAtIndex:0]; // 获取已有的数据库路径 dbPathShow = [[NSString alloc] initWithString:[strDocShow stringByAppendingPathComponent:@"user.sqlite"]]; //动态数组进行初始化 self.arrDataShow = [[NSMutableArray alloc] init]; //对路径进行编码 const char * dbEncodedShow = [dbPathShow UTF8String]; //数据库模型 sqlite3_stmt * statement; //数据库打开成功 if(sqlite3_open(dbEncodedShow, &dbUserShow) == SQLITE_OK) { NSLog(@"打开数据库成功"); //查询语句 NSString * strSqlSelect = [NSString stringWithFormat:@"select name, id from TbUser "]; //对语句编码 const char * charSqlSelect = [strSqlSelect UTF8String]; if(sqlite3_prepare_v2(dbUserShow, charSqlSelect, -1, &statement, NULL) == SQLITE_OK)//数据库查询成功 { NSLog(@"查询数据成功"); while (sqlite3_step(statement) == SQLITE_ROW)//对数据库进行循环遍历 { ObjData * objUser = [[ObjData alloc] init];//创建一个数据封装对象 objUser.objName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];//获取索引为0的数据 objUser.objId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];//获取索引为1的数据 [self.arrDataShow addObject:objUser];//对数据进行初始化 NSLog(@"遍历数据..."); } } else { NSLog(@"查询数据模型出现错误: %s", sqlite3_errmsg(dbUserShow));//如果出现问题就打印出来 } // 销毁Statement对象 sqlite3_finalize(statement); }}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1;//返回一个分组}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [self.arrDataShow count];//返回分组的数量}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ NSString * identifier = @"CellShow";//标示符 UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];//从队列中抓取一个单元格 if (cell == nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];//单元格初始化 } //字符串赋值,进行类型转换,根据index.path cell.textLabel.text =((ObjData *)[self.arrDataShow objectAtIndex:indexPath.row]).objName; cell.detailTextLabel.text =((ObjData *)[self.arrDataShow objectAtIndex:indexPath.row]).objId; return cell;}- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle == UITableViewCellEditingStyleDelete) { if (editingStyle == UITableViewCellEditingStyleDelete) { // 获取要删除的信息 ObjData * objUser = [self.arrDataShow objectAtIndex:indexPath.row]; sqlite3_stmt *statement; NSString * querySql = [NSString stringWithFormat:@"delete from TbUser where id = \"%@\"",objUser.objId]; const char * sql = [querySql UTF8String]; // 编译SQL 语句,创建Statement 对象 if(sqlite3_prepare_v2(dbUserShow, sql, -1, &statement, NULL) != SQLITE_OK) { NSAssert1(0, @"创建删除对象模型失败:'%s'", sqlite3_errmsg(dbUserShow)); } if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert1(0, @"删除失败:'%s'", sqlite3_errmsg(dbUserShow)); } // 重置数据库信息 sqlite3_reset(statement); // 删除当前的状态 sqlite3_finalize(statement); // 从数组中去掉删除的信息 [self.arrDataShow removeObject:objUser]; // 从表格显示中删除 [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } }}@end
9.关联TableViewController和显示类:
1)修改表单的映射类:
2)修改单元格的标示符:
3)配置表单代理:
10.测试:
可以成功执行插入数据操作。但显示数据却不是即时的。
另:
本例使用Xcode5没有成功。报错信息:
这似乎和NC自带的TVC有关。
- end