博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlite 实例教程 IOS下用sqlite打造词典
阅读量:7238 次
发布时间:2019-06-29

本文共 7925 字,大约阅读时间需要 26 分钟。

文章:http://blog.csdn.net/iukey/article/details/7318682

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

工程结构如下

最后效果图如下

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

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

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

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

1.创建数据库

 

- (const char*)getFilePath{
//获取数据库路径 return [[NSString stringWithFormat:@"%@/Documents/l",NSHomeDirectory() ] UTF8String]; }

 

 

//  DB.h  //iukey  #import 
#import "/usr/include/sqlite3.h" @interface DB : NSObject{ sqlite3* pdb;//数据库句柄 } @property(nonatomic,assign)sqlite3* pdb; - (BOOL)insertRecordWithEN:(NSString*)en CN:(NSString*)cn Comment:(NSString*)comment;//插入一条纪录 - (NSMutableArray*)quary:(NSString*)str;//查询 - (const char*)getFilePath;//获取数据库路径 - (BOOL)createDB;//创建数据库 - (BOOL)createTable;//创建表 @end

2.创建表

 

- (BOOL)createTable{  char* err;  char* sql = "create table dictionary(ID integer primary key autoincrement,en nvarchar(64),cn nvarchar(128),comment nvarchar(256))";//创建表语句      if (sql==NULL) {  return NO;      }  if (SQLITE_OK != sqlite3_open([self getFilePath ], &pdb)){  return NO;      }  if (SQLITE_OK == sqlite3_exec(pdb, sql, NULL, NULL, &err)) {
//执行创建表语句成功 sqlite3_close(pdb); return YES; }else{
//创建表失败 return NO; } }

 

3.插入一条纪录

- (BOOL)insertRecordWithEN:(NSString*)en CN:(NSString*)cn Comment:(NSString*)comment{  int ret = 0;  if (SQLITE_OK != sqlite3_open([self getFilePath ], &pdb)){
//打开数据库 return NO; } char* sql = "insert into dictionary(en,cn,comment) values(?,?,?);";//插入语句,3个参数 sqlite3_stmt* stmt;// if (sqlite3_prepare_v2(pdb, sql, -1, &stmt, nil)==SQLITE_OK) {
//准备语句 sqlite3_bind_text(stmt, 1, [en UTF8String], -1, NULL);//绑定参数 sqlite3_bind_text(stmt, 2, [cn UTF8String], -1, NULL); sqlite3_bind_text(stmt, 3, [comment UTF8String], -1, NULL); }else{ return NO; } if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {
//执行查询 sqlite3_finalize(stmt); sqlite3_close(pdb); return YES; }else{ return NO; } }

 

4.查询

- (NSMutableArray*)quary:(NSString *)str{      NSMutableArray* arr =[[NSMutableArray alloc]init];//存放查询结果      if (SQLITE_OK != sqlite3_open([self getFilePath ], &pdb)){  return NO;      }  char* sql = "select * from dictionary where en like ? or cn like ? or comment like ?;";//查询语句      sqlite3_stmt* stmt;  if (sqlite3_prepare_v2(pdb, sql, -1, &stmt, nil)==SQLITE_OK) {
//准备 sqlite3_bind_text(stmt, 1,[[NSString stringWithFormat:@"%%%@%%",str]UTF8String], -1, NULL); sqlite3_bind_text(stmt, 2, [[NSString stringWithFormat:@"%%%@%%",str]UTF8String], -1, NULL); sqlite3_bind_text(stmt, 3, [[NSString stringWithFormat:@"%%%@%%",str]UTF8String], -1, NULL); }else{ return nil; } 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 = [[NSMutableDictionary alloc]init];//单条纪录 [dict setObject:[NSString stringWithCString:_en encoding:NSUTF8StringEncoding] forKey:@"kEN"]; [dict setObject:[NSString stringWithCString:_cn encoding:NSUTF8StringEncoding] forKey:@"kCN"]; [dict setObject:[NSString stringWithCString:_comment encoding:NSUTF8StringEncoding] forKey:@"kCOMMENT"]; [arr addObject:dict];//插入到结果数组 } sqlite3_finalize(stmt); sqlite3_close(pdb); return [arr autorelease];//返回查询结果数组 }

5.DB 初始化

 

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

 

#define FIRSTINIT 1//第一次运行则设为1,否则就是0  - (id)init{      self = [super init];  if (self!=nil) {  #if FIRSTINIT          [self createDB];          [self createTable];          [self insertRecordWithEN:@"cctv1" CN:@"央视1套" Comment:@"SB电视台1"];//为了方便测试我插入了一些纪录          [self insertRecordWithEN:@"cctv2" CN:@"央视2套" Comment:@"SB电视台2"];          [self insertRecordWithEN:@"cctv3" CN:@"央视3套" Comment:@"SB电视台3"];          [self insertRecordWithEN:@"cctv4" CN:@"央视4套" Comment:@"SB电视台4"];          [self insertRecordWithEN:@"cctv5" CN:@"央视5套" Comment:@"SB电视台5"];          [self insertRecordWithEN:@"cctv6" CN:@"央视6套" Comment:@"SB电视台6"];          [self insertRecordWithEN:@"cctv7" CN:@"央视7套" Comment:@"SB电视台7"];          [self insertRecordWithEN:@"cctv8" CN:@"央视8套" Comment:@"SB电视台8"];          [self insertRecordWithEN:@"cctv9" CN:@"央视9套" Comment:@"SB电视台9"];          [self insertRecordWithEN:@"cctv10" CN:@"央视10套" Comment:@"SB电视台10"];          [self insertRecordWithEN:@"cctv11" CN:@"央视11套" Comment:@"SB电视台11"];          [self insertRecordWithEN:@"cctv12" CN:@"央视12套" Comment:@"SB电视台12"];  #endif      }  return self;  }

 

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

//  QueryResultList.h  //  iukey    #import 
#import "DB.h" @interface QueryResultList : UITableViewController
{ 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 = [super initWithStyle:style];  if (self) {          mArr  = [[NSMutableArray alloc]init];//表数据源          db =[[DB alloc]init];//数据库控制器          searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(44.0,0,200.0,44)];//搜索控件          searchBar.delegate=self;//设置搜索控件的委托          self.navigationItem.titleView = searchBar;      }  return self;  }

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

#pragma mark - Table view data source  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  return 1;//分区数  }  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  return [mArr count];//行数  }  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  static NSString *CellIdentifier = @"Cell";      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  for ( UIView* view in cell.contentView.subviews) {          [view removeFromSuperview];      }  if (cell == nil) {          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];      }      UILabel* lblEN = [[UILabel alloc]initWithFrame:CGRectMake(5.0, 5.0, 300.0, 30.0)];//显示英文的文字标签控件      UILabel* lblCN = [[UILabel alloc]initWithFrame:CGRectMake(5.0, 35.0, 300.0, 30.0)];//中文      UILabel* lblComment = [[UILabel alloc]initWithFrame:CGRectMake(5.0, 65.0, 300.0, 30.0)];//详细  //背景颜色清掉      lblEN.backgroundColor = [UIColor clearColor];      lblCN.backgroundColor = [UIColor clearColor];      lblComment.backgroundColor = [UIColor clearColor];  //     lblEN.text = [[mArr objectAtIndex:indexPath.row] objectForKey:@"kEN"];      lblCN.text = [[mArr objectAtIndex:indexPath.row] objectForKey:@"kCN"];      lblComment.text = [[mArr objectAtIndex:indexPath.row] objectForKey:@"kCOMMENT"];      [cell.contentView addSubview:lblEN];      [cell.contentView addSubview:lblCN];      [cell.contentView addSubview:lblComment];      cell.selectionStyle = UITableViewCellSelectionStyleNone;//选中不要高亮      [lblEN release];      [lblCN release];      [lblComment release];  return cell;  }

 

然后实现搜索委托方法:

#pragma mark - UISearchBar delegate  - (void) searchBarSearchButtonClicked:(UISearchBar*)activeSearchbar{      [mArr removeAllObjects];      NSString* query= searchBar.text;       NSMutableArray* arr = [db quary:query];  for ( NSMutableDictionary* dict in arr) {          [mArr addObject:dict];      }      [searchBar resignFirstResponder];      [self.tableView reloadData];  }

 

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

转载于:https://www.cnblogs.com/pengyingh/articles/2429778.html

你可能感兴趣的文章
android布局 - fill_parent/match_paren/wrap_content的区别
查看>>
论go语言中goroutine的使用
查看>>
解决td标签上的position:relative属性在各浏览器中的兼容性问题
查看>>
H5图片上传插件
查看>>
iOS5问题汇总
查看>>
[译]Chipmunk教程 - 3 初始化
查看>>
也谈WebKit、Gecko使用图形库
查看>>
6个寓言故事
查看>>
android用sharepreference保存输入框中的内容
查看>>
C# 鼠标穿透窗体功能
查看>>
Windows平台上C++开发内存泄漏检查方法
查看>>
hbase 0.96 java 示例
查看>>
XML与Web Service基础知识点
查看>>
visual studio使用技巧
查看>>
C#几个经常犯错误汇总
查看>>
jQuery data(key, value)函数 在匹配的元素上随心所欲的存放数据 (2
查看>>
经典排序之 冒泡排序
查看>>
PHP 定义栈结构,实现min函数,获取栈最小元素,要求时间复杂度为O(1)
查看>>
ASP.NET 面试题大全
查看>>
设置 xcode 使用arc
查看>>