sqlite 是个好东西,对于移动平台来说。一直想写有关sqlite的教程,但是不知道从何写起,考虑了很久,还是从一个小Demo 谈起吧。我写了一个精简版的词典,实现了增删查改的基本功能。
工程结构如下。最后效果图如下
。
效果图中可以看到,我查询 “cc”,所有相关条目都查询出来了。
好了,现在开始讲解我的项目。首先可以看我的工程目录,QueryResultList 是界面控制类,DB 是数据库操作类。
整个项目的流程:我们在search框中输入要查询的内容点击搜索,底层模糊查询返回结果显示在tableView中。
我们先从底层的操作讲起,目前我就实现了插入与查询操作,删除与修改以后再补上:
1.创建数据库
源码
打印
?
- -(constchar*)getFilePath{//获取数据库路径
- return[[NSStringstringWithFormat:@"%@/Documents/l",NSHomeDirectory()]UTF8String];
- }
?
- //DB.h
- //iukey
- #import<Foundation/Foundation.h>
- #import”/usr/include/sqlite3.h”
- @interfaceDB:NSObject{
- sqlite3*pdb;//数据库句柄
- }
- @property(nonatomic,assign)sqlite3*pdb;
- -(BOOL)insertRecordWithEN:(NSString*)enCN:(NSString*)cnComment:(NSString*)comment;//插入一条纪录
- -(NSMutableArray*)quary:(NSString*)str;//查询
-
- -(constchar*)getFilePath;//获取数据库路径
- -(BOOL)createDB;//创建数据库
- -(BOOL)createTable;//创建表
- @end
2.创建表
?
- -(BOOL)createTable{
- char*err;
- char*sql=”createtabledictionary(IDintegerprimarykeyautoincrement,ennvarchar(64),cnnvarchar(128),commentnvarchar(256))”;//创建表语句
- if(sql==NULL){
- returnNO;
- }
- if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){
- returnNO;
- }
-
- if(SQLITE_OK==sqlite3_exec(pdb,sql,NULL,&err)){//执行创建表语句成功
- sqlite3_close(pdb);
- returnYES;
- }else{//创建表失败
- returnNO;
- }
- }
3.插入一条纪录
?
- -(BOOL)insertRecordWithEN:(NSString*)enCN:(NSString*)cnComment:(NSString*)comment{
- intret=0;
- if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){//打开数据库
- returnNO;
- }
- char*sql=”insertintodictionary(en,cn,comment)values(?,?,?);”;//插入语句,3个参数
- sqlite3_stmt*stmt;//
- if(sqlite3_prepare_v2(pdb,-1,&stmt,nil)==SQLITE_OK){//准备语句
- sqlite3_bind_text(stmt,1,[enUTF8String],NULL);//绑定参数
- sqlite3_bind_text(stmt,2,[cnUTF8String],NULL);
- sqlite3_bind_text(stmt,3,[commentUTF8String],NULL);
- }else{
- returnNO;
- }
- if(SQLITE_DONE==(ret=sqlite3_step(stmt))){//执行查询
- sqlite3_finalize(stmt);
- sqlite3_close(pdb);
- returnYES;
- }else{
- returnNO;
- }
- }
4.查询
?
- -(NSMutableArray*)quary:(NSString*)str{
- NSMutableArray*arr=[[NSMutableArrayalloc]init];//存放查询结果
- if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){
- returnNO;
- }
- char*sql=”select*fromdictionarywhereenlike?orcnlike?orcommentlike?;”;//查询语句
- sqlite3_stmt*stmt;
- if(sqlite3_prepare_v2(pdb,nil)==SQLITE_OK){//准备
- sqlite3_bind_text(stmt,[[NSStringstringWithFormat:@"%%%@%%",str]UTF8String],NULL);
- }else{
- returnnil;
- }
- while(SQLITE_ROW==sqlite3_step(stmt)){//执行
- char*_en=(char*)sqlite3_column_text(stmt,1);
- char*_cn=(char*)sqlite3_column_text(stmt,2);
- char*_comment=(char*)sqlite3_column_text(stmt,3);
-
- NSMutableDictionary*dict=[[NSMutableDictionaryalloc]init];//单条纪录
- [dictsetObject:[NSStringstringWithCString:_enencoding:NSUTF8StringEncoding]forKey:@”kEN”];
- [dictsetObject:[NSStringstringWithCString:_cnencoding:NSUTF8StringEncoding]forKey:@”kCN”];
- [dictsetObject:[NSStringstringWithCString:_commentencoding:NSUTF8StringEncoding]forKey:@”kCOMMENT”];
- [arraddObject:dict];//插入到结果数组
- }
- sqlite3_finalize(stmt);
- sqlite3_close(pdb);
- return[arrautorelease];//返回查询结果数组
- }
5.DB 初始化
我先定义了一个宏,用来标识是否是第一次运行程序,如果是第一次运行就要运行创建数据库与表的函数,否则就不运行,具体看代码:
?
- #defineFIRSTINIT1//第一次运行则设为1,否则就是0
- -(id)init{
- self=[superinit];
- if(self!=nil){
- #ifFIRSTINIT
- [selfcreateDB];
- [selfcreateTable];
- [selfinsertRecordWithEN:@"cctv1"CN:@"央视1套"Comment:@"SB电视台1"];//为了方便测试我插入了一些纪录
- [selfinsertRecordWithEN:@"cctv2"CN:@"央视2套"Comment:@"SB电视台2"];
- [selfinsertRecordWithEN:@"cctv3"CN:@"央视3套"Comment:@"SB电视台3"];
- [selfinsertRecordWithEN:@"cctv4"CN:@"央视4套"Comment:@"SB电视台4"];
- [selfinsertRecordWithEN:@"cctv5"CN:@"央视5套"Comment:@"SB电视台5"];
- [selfinsertRecordWithEN:@"cctv6"CN:@"央视6套"Comment:@"SB电视台6"];
- [selfinsertRecordWithEN:@"cctv7"CN:@"央视7套"Comment:@"SB电视台7"];
- [selfinsertRecordWithEN:@"cctv8"CN:@"央视8套"Comment:@"SB电视台8"];
- [selfinsertRecordWithEN:@"cctv9"CN:@"央视9套"Comment:@"SB电视台9"];
- [selfinsertRecordWithEN:@"cctv10"CN:@"央视10套"Comment:@"SB电视台10"];
- [selfinsertRecordWithEN:@"cctv11"CN:@"央视11套"Comment:@"SB电视台11"];
- [selfinsertRecordWithEN:@"cctv12"CN:@"央视12套"Comment:@"SB电视台12"];
- #endif
- }
- returnself;
- }
底层的数据库暂时就这些,接着讲上层的界面部分
?
- //QueryResultList.h
- //iukey
-
- #import<UIKit/UIKit.h>
- #import”DB.h”
-
- @interfaceQueryResultList:UITableViewController<UISearchBarDelegate>{
- NSMutableArray*mArr;//tableView数据源
- DB*db;//数据库对象
- UISearchBar*searchBar;//搜索框
- }
- @property(nonatomic,retain)NSMutableArray*mArr;
- @property(nonatomic,retain)DB*db;
- @property(nonatomic,retain)UISearchBar*searchBar;
- @end
?
- -(id)initWithStyle:(UITableViewStyle)style{
- self=[superinitWithStyle:style];
- if(self){
- mArr=[[NSMutableArrayalloc]init];//表数据源
- db=[[DBalloc]init];//数据库控制器
- searchBar=[[UISearchBaralloc]initWithFrame:CGRectMake(44.0,200.0,44)];//搜索控件
- searchBar.delegate=self;//设置搜索控件的委托
- self.navigationItem.titleView=searchBar;
- }
- returnself;
- }
接下来我们实现表格数据源委托
?
- #pragmamark-Tableviewdatasource
-
- -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{
- return1;//分区数
- }
-
- -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{
- return[mArrcount];//行数
- }
-
- -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
- staticNSString*CellIdentifier=@”Cell”;
-
- UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
- for(UIView*viewincell.contentView.subviews){
- [viewremoveFromSuperview];
- }
-
- if(cell==nil){
- cell=[[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]autorelease];
- }
- UILabel*lblEN=[[UILabelalloc]initWithFrame:CGRectMake(5.0,5.0,300.0,30.0)];//显示英文的文字标签控件
- UILabel*lblCN=[[UILabelalloc]initWithFrame:CGRectMake(5.0,35.0,30.0)];//中文
- UILabel*lblComment=[[UILabelalloc]initWithFrame:CGRectMake(5.0,65.0,30.0)];//详细
-
- //背景颜色清掉
- lblEN.backgroundColor=[UIColorclearColor];
- lblCN.backgroundColor=[UIColorclearColor];
- lblComment.backgroundColor=[UIColorclearColor];
- //
- lblEN.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kEN”];
- lblCN.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kCN”];
- lblComment.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kCOMMENT”];
-
- [cell.contentViewaddSubview:lblEN];
- [cell.contentViewaddSubview:lblCN];
- [cell.contentViewaddSubview:lblComment];
-
- cell.selectionStyle=UITableViewCellSelectionStyleNone;//选中不要高亮
- [lblENrelease];
- [lblCNrelease];
- [lblCommentrelease];
-
- returncell;
- }
然后实现搜索委托方法:
?
- #pragmamark-UISearchBardelegate
- -(void)searchBarSearchButtonClicked:(UISearchBar*)activeSearchbar{
- [mArrremoveAllObjects];
- NSString*query=searchBar.text;
- NSMutableArray*arr=[dbquary:query];
- for(NSMutableDictionary*dictinarr){
- [mArraddObject:dict];
- }
- [searchBarresignFirstResponder];
- [self.tableViewreloadData];
- }
基本就结束了,这只是一个简单的Demo,sqlite的基本使用方法我也会慢慢整理出来,最后附上完整工程文件:DictionaryDemo
原文链接:http://www.52php.cn/article/p-nhkjrkvk-bcy.html (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|