iOS学习笔记(十五)——数据库操作(SQLite)_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > iOS学习笔记(十五)——数据库操作(SQLite)

iOS学习笔记(十五)——数据库操作(SQLite)

 2013/8/25 18:55:53  张兴业  博客园  我要评论(0)
  • 摘要:SQLite(http://www.sqlite.org/docs.html)是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、WindowsPhone等智能手机。iOS使用时SQLite,只需要加入libsqlite3.dylib依赖以及引入sqlite3.h头文件即可。数据库操作包含打开数据库、创建表,表的增、删、改、查。下面代码给出了数据库操作。创建并打开数据库:-(BOOL
  • 标签:笔记 学习 iOS 数据库 数据 SQL 操作 学习笔记

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

 

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

         创建并打开数据库:

 

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

 

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

 

-(void)execSql:(NSString *)sql
{    
    if ([self openDB]) {
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
            NSLog(@"数据库操作数据失败!");
        }else{
            NSLog(@"%@",sql);
        }
        sqlite3_close(db);
    }    
}

 

 

        创建表:

        

-(void) insertData{
    NSString *insertSql1= [NSString stringWithFormat:
                      @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
                      TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];
    [self execSql:insertSql1];
    
    NSString *insertSql2 = [NSString stringWithFormat:
                      @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
                      TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];
    [self execSql:insertSql2];
    
}

 

 

         修改表:

 

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


         删除表内容:

 

 

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


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

 

 

 

-(void) selectData{

    [self openDB];
    NSString *sqlQuery = [NSString stringWithFormat:
                      @"SELECT * FROM %@",TABLENAME];
    sqlite3_stmt * statement;
    
    if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
        
        //查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值

        while (sqlite3_step(statement) == SQLITE_ROW) {
            char *name = (char*)sqlite3_column_text(statement, 1);
            NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];
            
            int age = sqlite3_column_int(statement, 2);
            
            char *address = (char*)sqlite3_column_text(statement, 3);
            NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];
            
            NSLog(@"name:%@  age:%d  address:%@",nsNameStr,age, nsAddressStr);
        }
    }else{
        NSLog(@"select error:%@",sqlQuery);

    }
    sqlite3_close(db);
}


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

 

 

Demo下载

 

 

/** * @author 张兴业 *  http://blog.csdn.net/xyz_lmn *  iOS入门群:83702688
*  android开发进阶群:241395671 *  我的新浪微博@张兴业TBOW */   http://www.cnblogs.com/xiaobaizhu/archive/2012/12/07/2808170.html

 

 

上一篇: Java对象的浅度clone和深度clone 下一篇: 没有下一篇了!
发表评论
用户名: 匿名