iOS学习之SQLite数据库的简单使用


首先借助百度百科来解释下SQLite:
SQLite是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。
不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
此次demo,我选择利用interface builder建立,跟以往的纯代码创建界面略有不同。
1.创建一个名为SQLiteFirst的single View Application 工程。
2.添加支持SQLite的包;
iOS学习之SQLite数据库的简单使用_第1张图片
3.在ViewController中进行代码的编辑
ViewController.h中代码如下:
[cpp]  view plain copy print ?
  1. #import <UIKit/UIKit.h>  
  2. #import <sqlite3.h>  
  3. @interface ViewController : UIViewController  
  4. {  
  5.     sqlite3 *contactDB;  
  6.       
  7.     UITextField *name;  
  8.     UITextField *address;  
  9.     UITextField *phone;  
  10.     UITextField *searchName;  
  11.       
  12.     UILabel *status;  
  13.       
  14.     NSString *databasePath;  
  15. }  
  16. @property (retain,nonatomic)IBOutlet UITextField *name;  
  17. @property (retain,nonatomic)IBOutlet UITextField *address;  
  18. @property (retain,nonatomic)IBOutlet UITextField *phone;  
  19. @property (retain,nonatomic)IBOutlet UILabel *status;  
  20. @property (retain,nonatomic)IBOutlet UITextField *searchName;  
  21.   
  22. @end  
ViewController.m中主要代码如下:
[cpp]  view plain copy print ?
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.     /*根据路径创建数据库并创建一个表contact(id nametext addresstext phonetext)*/  
  6.     NSString *docsDir;  
  7.     NSArray *dirPaths;  
  8.       
  9.     //获取文件目录   
  10.     dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  11.     docsDir = [dirPaths objectAtIndex:0];  
  12.     //创建数据库文件路径  
  13.     databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]]  
  14.     ;  
  15.     NSFileManager *fileMG = [NSFileManager defaultManager];  
  16.     //先判断文件是否在指定的路径  
  17.     if ([fileMG fileExistsAtPath:databasePath] == NO) {  
  18.         const char *dbpath = [databasePath UTF8String];  
  19.         //如果数据库成功打开,则进行建表操作  
  20.         if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK) {  
  21.             char *errMsg;  
  22.             const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT,PHONE TEXT)";  
  23.             //sqlite3_exec这个方法可以执行没有返回结果的操作,例如创建、插入、删除等,这个函数包含了sqlite3_prepare这个函数的操作,目的是将UTF-8格式的SQL语句转换为编译后的语句  
  24.             if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg)!=SQLITE_OK) {  
  25.                 status.text = @"创建表失败\n";  
  26.             }  
  27.         }  
  28.         else  
  29.         {  
  30.             status.text = @"创建/打开数据库失败\n";  
  31.         }  
  32.     }  
  33.   
  34. }  
  35.   
  36. - (IBAction)SaveToDataBase:(id)sender  
  37. {  
  38.     sqlite3_stmt *statement;  
  39.     const char *dbpath = [databasePath UTF8String];  
  40.     //如果sqlite成功打开,则执行插入操作  
  41.     if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) {  
  42.         NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO CONTACTS (name,address,phone) VALUES(\"%@\",\"%@\",\"%@\")",name.text,address.text,phone.text];  
  43.         const char *insert_stmt = [insertSQL UTF8String];  
  44.         sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);  
  45.         if (sqlite3_step(statement) == SQLITE_DONE) {  
  46.             status.text = @"已存储到数据库";  
  47.             name.text = @"";  
  48.             address.text = @"";  
  49.             phone.text = @"";  
  50.             searchName.text = @"已能查询信息";  
  51.             searchName.placeholder = @"请输入联系人名";  
  52.             searchName.clearsOnBeginEditing = YES;  
  53.               
  54.         }  
  55.         else  
  56.         {  
  57.             status.text = @"保存失败";  
  58.         }  
  59.           
  60.         sqlite3_finalize(statement);  
  61.         sqlite3_close(contactDB);  
  62.     }  
  63. }  
  64. - (IBAction)SearchFromDataBase:(id)sender  
  65. {  
  66.     const char *dbpath = [databasePath UTF8String];  
  67.     sqlite3_stmt *statement;  
  68.     if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) {  
  69.         NSString *querySQL = [NSString stringWithFormat:@"SELECT address,phone from contacts where name=\"%@\"",searchName.text];  
  70.         const char *query_stmt = [querySQL UTF8String];  
  71.         //sqlite3_prepare_v2的作用是将UTF-8格式的SQL语句转换为编译后的语句,并返回指向该语句的指针  
  72.         if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) {  
  73.             //sqlite3_step的作用是在编译后的语句中向前移动一条记录,SQLITE_ROW代表一行  
  74.             if (sqlite3_step(statement) == SQLITE_ROW) {  
  75.                 //sqlite3_column_text返回一个字符串类型的值,后面的数字对应每一列,同时用initWithUTF8String方法将C字符串转化成OC字符串  
  76.                 NSString *addressField = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)];  
  77.                 address.text = addressField;  
  78.                   
  79.                 NSString *phoneField = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 1    )];  
  80.                 phone.text = phoneField;  
  81.                   
  82.                 name.text = searchName.text;  
  83.                 status.text = @"已将查询到结果";  
  84.                 [addressField release];  
  85.                 [phoneField release];  
  86.             }  
  87.             else{  
  88.                 status.text = @"未查到结果";  
  89.                 address.text = @"";  
  90.                 phone.text = @"";  
  91.                 searchName.text = @"请输入已经保存的联系人姓名";  
  92.                   
  93.             }  
  94.             //删除编译后的语句  
  95.             sqlite3_finalize(statement);  
  96.         }  
  97.         //关闭数据库  
  98.         sqlite3_close(contactDB);  
  99.     }  
  100. }  
  101. - (IBAction)sureBtn:(id)sender{  
  102.     [name resignFirstResponder];  
  103.     [address resignFirstResponder];  
  104.     [phone resignFirstResponder];  
  105.     [searchName resignFirstResponder];  
  106. }  
  107. - (IBAction)cleanAciton:(id)sender  
  108. {  
  109.     name.text = @"";  
  110.     phone.text = @"";  
  111.     address.text =@"";  
  112.     searchName.text = @"";  
  113. }  
demo:http://blog.csdn.net/zhuangjingweijojo/article/details/8940519

你可能感兴趣的:(iOS学习之SQLite数据库的简单使用)