zoukankan      html  css  js  c++  java
  • 【转】iOS学习笔记(十五)——数据库操作(SQLite)

    SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。iOS 使用时SQLite,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。

              数据库操作包含打开数据库、创建表,表的增、删、改、查。下面代码给出了数据库操作。

             创建并打开数据库:

    1. -(BOOL) openDB{  
    2.    //获取数据库路径  
    3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    4.     NSString *documents = [paths objectAtIndex:0];  
    5.     NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];  
    6.       
    7.     //如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)  
    8.     //打开数据库,这里的[path UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是  
    9.     //Objective-C)编写的,它不知道什么是NSString.  
    10.     if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {  
    11.         return YES;  
    12.     }else{  
    13.         return NO;  
    14.         NSLog(@"数据库打开失败");  
    15.         sqlite3_close(db);  
    16.     }  
    17. }  

             iOS中没有提供创建数据库的命令,当使用sqlite3_open时,如果数据库文件不存在会自行创建数据库,如果存在会打开数据库。打开数据库后就可以创建表并操作表内容了,iOS中的sqlite3使用sqlite3_exec来创建表、插入表内容、修改表内容、删除表内容等操作,使用sqlite3_prepare_v2来查询表。下面给给出了sqlite3_exec的封装:

    1. -(void)execSql:(NSString *)sql  
    2. {      
    3.     if ([self openDB]) {  
    4.         char *err;  
    5.         if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {  
    6.             NSLog(@"数据库操作数据失败!");  
    7.         }else{  
    8.             NSLog(@"%@",sql);  
    9.         }  
    10.         sqlite3_close(db);  
    11.     }      
    12. }  

            创建表:

    1. NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];  
    2.     [self execSql:sqlCreateTable];  

            插入数据:

    1. -(void) insertData{  
    2.     NSString *insertSql1= [NSString stringWithFormat:  
    3.                       @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
    4.                       TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];  
    5.     [self execSql:insertSql1];  
    6.       
    7.     NSString *insertSql2 = [NSString stringWithFormat:  
    8.                       @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
    9.                       TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];  
    10.     [self execSql:insertSql2];  
    11.       
    12. }  

             修改表:

    1. -(void) updateData{  
    2.     NSString *updateSql = [NSString stringWithFormat:  
    3.                       @"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",  
    4.                       TABLENAME,   AGE,  @"15" ,AGE,  @"13"];  
    5.     [self execSql:updateSql];  
    6. }  


             删除表内容:

    1. -(void) deleteData{  
    2.     NSString *sdeleteSql = [NSString stringWithFormat:  
    3.                       @"delete from %@ where %@ = '%@'",  
    4.                       TABLENAME, NAME, @"张三"];  
    5.     [self execSql:sdeleteSql];  
    6. }  


    上面实现了表内容的增、改、删,下面实现表内容查询。

    1. -(void) selectData{  
    2.   
    3.     [self openDB];  
    4.     NSString *sqlQuery = [NSString stringWithFormat:  
    5.                       @"SELECT * FROM %@",TABLENAME];  
    6.     sqlite3_stmt * statement;  
    7.       
    8.     if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {  
    9.           
    10.         //查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值  
    11.   
    12.         while (sqlite3_step(statement) == SQLITE_ROW) {  
    13.             char *name = (char*)sqlite3_column_text(statement, 1);  
    14.             NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];  
    15.               
    16.             int age = sqlite3_column_int(statement, 2);  
    17.               
    18.             char *address = (char*)sqlite3_column_text(statement, 3);  
    19.             NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];  
    20.               
    21.             NSLog(@"name:%@  age:%d  address:%@",nsNameStr,age, nsAddressStr);  
    22.         }  
    23.     }else{  
    24.         NSLog(@"select error:%@",sqlQuery);  
    25.   
    26.     }  
    27.     sqlite3_close(db);  
    28. }  


    好了,这就是全部了,iOS中数据库操作的类封装的并不太好用,希望大家尽量封装自己的类,。

    Demo下载

    /**
    * @author 张兴业
    *  iOS入门群:83702688
    *  android开发进阶群:241395671
    *  我的新浪微博:@张兴业TBOW
    */
     
    http://www.cnblogs.com/xiaobaizhu/archive/2012/12/07/2808170.html
     
    from:http://blog.csdn.net/xyz_lmn/article/details/8968203
  • 相关阅读:
    面向过程编程
    生成器
    迭代器
    装饰器
    函数对象与闭包
    名称空间和作用域
    Django中的as_view方法源码分析
    DRF3序列化反序列化
    DRF4级联与外键字段
    django--BBS项目,后端业务逻辑整理
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/5125330.html
Copyright © 2011-2022 走看看