加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite 实例教程 IOS下用sqlite打造词典

发布时间:2020-12-12 20:09:55 所属栏目:百科 来源:网络整理
导读:sqlite 是个好东西,对于移动平台来说。一直想写有关sqlite的教程,但是不知道从何写起,考虑了很久,还是从一个小Demo 谈起吧。我写了一个精简版的词典,实现了增删查改的基本功能。 工程结构如下。最后效果图如下 。 效果图中可以看到,我查询 “cc”,所有

sqlite 是个好东西,对于移动平台来说。一直想写有关sqlite的教程,但是不知道从何写起,考虑了很久,还是从一个小Demo 谈起吧。我写了一个精简版的词典,实现了增删查改的基本功能。

工程结构如下。最后效果图如下

效果图中可以看到,我查询 “cc”,所有相关条目都查询出来了。

好了,现在开始讲解我的项目。首先可以看我的工程目录,QueryResultList 是界面控制类,DB 是数据库操作类。

整个项目的流程:我们在search框中输入要查询的内容点击搜索,底层模糊查询返回结果显示在tableView中。

我们先从底层的操作讲起,目前我就实现了插入与查询操作,删除与修改以后再补上:

1.创建数据库

源码 打印 ?
  1. -(constchar*)getFilePath{//获取数据库路径
  2. return[[NSStringstringWithFormat:@"%@/Documents/l",NSHomeDirectory()]UTF8String];
  3. }
  1. //DB.h
  2. //iukey
  3. #import<Foundation/Foundation.h>
  4. #import”/usr/include/sqlite3.h”
  5. @interfaceDB:NSObject{
  6. sqlite3*pdb;//数据库句柄
  7. }
  8. @property(nonatomic,assign)sqlite3*pdb;
  9. -(BOOL)insertRecordWithEN:(NSString*)enCN:(NSString*)cnComment:(NSString*)comment;//插入一条纪录
  10. -(NSMutableArray*)quary:(NSString*)str;//查询
  11. -(constchar*)getFilePath;//获取数据库路径
  12. -(BOOL)createDB;//创建数据库
  13. -(BOOL)createTable;//创建表
  14. @end

2.创建表

  1. -(BOOL)createTable{
  2. char*err;
  3. char*sql=”createtabledictionary(IDintegerprimarykeyautoincrement,ennvarchar(64),cnnvarchar(128),commentnvarchar(256))”;//创建表语句
  4. if(sql==NULL){
  5. returnNO;
  6. }
  7. if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){
  8. returnNO;
  9. }
  10. if(SQLITE_OK==sqlite3_exec(pdb,sql,NULL,&err)){//执行创建表语句成功
  11. sqlite3_close(pdb);
  12. returnYES;
  13. }else{//创建表失败
  14. returnNO;
  15. }
  16. }

3.插入一条纪录

  1. -(BOOL)insertRecordWithEN:(NSString*)enCN:(NSString*)cnComment:(NSString*)comment{
  2. intret=0;
  3. if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){//打开数据库
  4. returnNO;
  5. }
  6. char*sql=”insertintodictionary(en,cn,comment)values(?,?,?);”;//插入语句,3个参数
  7. sqlite3_stmt*stmt;//
  8. if(sqlite3_prepare_v2(pdb,-1,&stmt,nil)==SQLITE_OK){//准备语句
  9. sqlite3_bind_text(stmt,1,[enUTF8String],NULL);//绑定参数
  10. sqlite3_bind_text(stmt,2,[cnUTF8String],NULL);
  11. sqlite3_bind_text(stmt,3,[commentUTF8String],NULL);
  12. }else{
  13. returnNO;
  14. }
  15. if(SQLITE_DONE==(ret=sqlite3_step(stmt))){//执行查询
  16. sqlite3_finalize(stmt);
  17. sqlite3_close(pdb);
  18. returnYES;
  19. }else{
  20. returnNO;
  21. }
  22. }

4.查询

  1. -(NSMutableArray*)quary:(NSString*)str{
  2. NSMutableArray*arr=[[NSMutableArrayalloc]init];//存放查询结果
  3. if(SQLITE_OK!=sqlite3_open([selfgetFilePath],&pdb)){
  4. returnNO;
  5. }
  6. char*sql=”select*fromdictionarywhereenlike?orcnlike?orcommentlike?;”;//查询语句
  7. sqlite3_stmt*stmt;
  8. if(sqlite3_prepare_v2(pdb,nil)==SQLITE_OK){//准备
  9. sqlite3_bind_text(stmt,[[NSStringstringWithFormat:@"%%%@%%",str]UTF8String],NULL);
  10. }else{
  11. returnnil;
  12. }
  13. while(SQLITE_ROW==sqlite3_step(stmt)){//执行
  14. char*_en=(char*)sqlite3_column_text(stmt,1);
  15. char*_cn=(char*)sqlite3_column_text(stmt,2);
  16. char*_comment=(char*)sqlite3_column_text(stmt,3);
  17. NSMutableDictionary*dict=[[NSMutableDictionaryalloc]init];//单条纪录
  18. [dictsetObject:[NSStringstringWithCString:_enencoding:NSUTF8StringEncoding]forKey:@”kEN”];
  19. [dictsetObject:[NSStringstringWithCString:_cnencoding:NSUTF8StringEncoding]forKey:@”kCN”];
  20. [dictsetObject:[NSStringstringWithCString:_commentencoding:NSUTF8StringEncoding]forKey:@”kCOMMENT”];
  21. [arraddObject:dict];//插入到结果数组
  22. }
  23. sqlite3_finalize(stmt);
  24. sqlite3_close(pdb);
  25. return[arrautorelease];//返回查询结果数组
  26. }

5.DB 初始化

我先定义了一个宏,用来标识是否是第一次运行程序,如果是第一次运行就要运行创建数据库与表的函数,否则就不运行,具体看代码:

  1. #defineFIRSTINIT1//第一次运行则设为1,否则就是0
  2. -(id)init{
  3. self=[superinit];
  4. if(self!=nil){
  5. #ifFIRSTINIT
  6. [selfcreateDB];
  7. [selfcreateTable];
  8. [selfinsertRecordWithEN:@"cctv1"CN:@"央视1套"Comment:@"SB电视台1"];//为了方便测试我插入了一些纪录
  9. [selfinsertRecordWithEN:@"cctv2"CN:@"央视2套"Comment:@"SB电视台2"];
  10. [selfinsertRecordWithEN:@"cctv3"CN:@"央视3套"Comment:@"SB电视台3"];
  11. [selfinsertRecordWithEN:@"cctv4"CN:@"央视4套"Comment:@"SB电视台4"];
  12. [selfinsertRecordWithEN:@"cctv5"CN:@"央视5套"Comment:@"SB电视台5"];
  13. [selfinsertRecordWithEN:@"cctv6"CN:@"央视6套"Comment:@"SB电视台6"];
  14. [selfinsertRecordWithEN:@"cctv7"CN:@"央视7套"Comment:@"SB电视台7"];
  15. [selfinsertRecordWithEN:@"cctv8"CN:@"央视8套"Comment:@"SB电视台8"];
  16. [selfinsertRecordWithEN:@"cctv9"CN:@"央视9套"Comment:@"SB电视台9"];
  17. [selfinsertRecordWithEN:@"cctv10"CN:@"央视10套"Comment:@"SB电视台10"];
  18. [selfinsertRecordWithEN:@"cctv11"CN:@"央视11套"Comment:@"SB电视台11"];
  19. [selfinsertRecordWithEN:@"cctv12"CN:@"央视12套"Comment:@"SB电视台12"];
  20. #endif
  21. }
  22. returnself;
  23. }

底层的数据库暂时就这些,接着讲上层的界面部分

  1. //QueryResultList.h
  2. //iukey
  3. #import<UIKit/UIKit.h>
  4. #import”DB.h”
  5. @interfaceQueryResultList:UITableViewController<UISearchBarDelegate>{
  6. NSMutableArray*mArr;//tableView数据源
  7. DB*db;//数据库对象
  8. UISearchBar*searchBar;//搜索框
  9. }
  10. @property(nonatomic,retain)NSMutableArray*mArr;
  11. @property(nonatomic,retain)DB*db;
  12. @property(nonatomic,retain)UISearchBar*searchBar;
  13. @end
  1. -(id)initWithStyle:(UITableViewStyle)style{
  2. self=[superinitWithStyle:style];
  3. if(self){
  4. mArr=[[NSMutableArrayalloc]init];//表数据源
  5. db=[[DBalloc]init];//数据库控制器
  6. searchBar=[[UISearchBaralloc]initWithFrame:CGRectMake(44.0,200.0,44)];//搜索控件
  7. searchBar.delegate=self;//设置搜索控件的委托
  8. self.navigationItem.titleView=searchBar;
  9. }
  10. returnself;
  11. }

接下来我们实现表格数据源委托

  1. #pragmamark-Tableviewdatasource
  2. -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{
  3. return1;//分区数
  4. }
  5. -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{
  6. return[mArrcount];//行数
  7. }
  8. -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
  9. staticNSString*CellIdentifier=@”Cell”;
  10. UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
  11. for(UIView*viewincell.contentView.subviews){
  12. [viewremoveFromSuperview];
  13. }
  14. if(cell==nil){
  15. cell=[[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]autorelease];
  16. }
  17. UILabel*lblEN=[[UILabelalloc]initWithFrame:CGRectMake(5.0,5.0,300.0,30.0)];//显示英文的文字标签控件
  18. UILabel*lblCN=[[UILabelalloc]initWithFrame:CGRectMake(5.0,35.0,30.0)];//中文
  19. UILabel*lblComment=[[UILabelalloc]initWithFrame:CGRectMake(5.0,65.0,30.0)];//详细
  20. //背景颜色清掉
  21. lblEN.backgroundColor=[UIColorclearColor];
  22. lblCN.backgroundColor=[UIColorclearColor];
  23. lblComment.backgroundColor=[UIColorclearColor];
  24. //
  25. lblEN.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kEN”];
  26. lblCN.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kCN”];
  27. lblComment.text=[[mArrobjectAtIndex:indexPath.row]objectForKey:@”kCOMMENT”];
  28. [cell.contentViewaddSubview:lblEN];
  29. [cell.contentViewaddSubview:lblCN];
  30. [cell.contentViewaddSubview:lblComment];
  31. cell.selectionStyle=UITableViewCellSelectionStyleNone;//选中不要高亮
  32. [lblENrelease];
  33. [lblCNrelease];
  34. [lblCommentrelease];
  35. returncell;
  36. }

然后实现搜索委托方法:

  1. #pragmamark-UISearchBardelegate
  2. -(void)searchBarSearchButtonClicked:(UISearchBar*)activeSearchbar{
  3. [mArrremoveAllObjects];
  4. NSString*query=searchBar.text;
  5. NSMutableArray*arr=[dbquary:query];
  6. for(NSMutableDictionary*dictinarr){
  7. [mArraddObject:dict];
  8. }
  9. [searchBarresignFirstResponder];
  10. [self.tableViewreloadData];
  11. }

基本就结束了,这只是一个简单的Demo,sqlite的基本使用方法我也会慢慢整理出来,最后附上完整工程文件:DictionaryDemo


原文链接:http://www.52php.cn/article/p-nhkjrkvk-bcy.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读