`
zhengjj_2009
  • 浏览: 155135 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OC的SQLite可参考的方法

 
阅读更多

看别人的代码,觉得有些代码封装得不错,所以保留下来,希望有帮助。

操作数据库的接口部分:

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface BaseDB : NSObject
//创建表
- (void)createTable:(NSString *)sql;
/**
 * 接口描述:插入数据、删除数据、修改数据
 * 参数:  sql: SQL语句
 * 返回值:是否执行成功 *
 */
- (BOOL)dealData:(NSString *)sql paramsarray:(NSArray *)params;

/**
 *  接口描述:查询数据
 *  参数:  sql:SQL语句
 *  返回值:[
                [“字段值1”,“字段值2”,“字段值3”],
                [“字段值1”,“字段值2”,“字段值3”],
                [“字段值1”,“字段值2”,“字段值3”], 
           ]
 */
- (NSMutableArray *)selectData:(NSString *)sql columns:(int)number;
@end

 

每个接口的实现部分:

#import "BaseDB.h"
#define kFilename  @"data.sqlite"
@implementation BaseDB
- (NSString *)filePath {
    NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@",kFilename];
    return filePath;
}
- (void)createTable:(NSString *)sql {
    sqlite3 *sqlite = nil;
    //打开数据库
    if (sqlite3_open([self.filePath UTF8String], &sqlite) != SQLITE_OK) {
        NSLog(@"打开数据库失败");
        sqlite3_close(sqlite);
        return;
    }
    
    //执行创建表SQL语句
    char *errmsg = nil;
    if (sqlite3_exec(sqlite, [sql UTF8String], NULL, NULL, &errmsg) != SQLITE_OK) {
        NSLog(@"创建表失败:%s",errmsg);
        sqlite3_close(sqlite);
    }
    //关闭数据库
    sqlite3_close(sqlite);   
}

/**
 * 接口描述:插入数据、删除数据、修改数据
 * 参数:  sql: SQL语句
 * 返回值:是否执行成功 *
 */
// INSERT INTO User(username,password,email) values(?,?,?)
- (BOOL)dealData:(NSString *)sql paramsarray:(NSArray *)params {
    sqlite3 *sqlite = nil;
    sqlite3_stmt *stmt = nil;    
    //打开数据库
    if (sqlite3_open([self.filePath UTF8String], &sqlite) != SQLITE_OK) {
        NSLog(@"打开数据库失败");
        sqlite3_close(sqlite);
        return NO;
    }
    
    //编译SQL语句
    if (sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL) != SQLITE_OK) {
        NSLog(@"SQL语句编译失败");
        sqlite3_close(sqlite);
        return NO;
    }
    
    //绑定数据
    for (int i=0; i<params.count; i++) {
        NSString *value = [params objectAtIndex:i];
        sqlite3_bind_text(stmt, i+1, [value UTF8String], -1, NULL);
    }

    //执行SQL语句
    if(sqlite3_step(stmt) == SQLITE_ERROR) {
        NSLog(@"SQL语句执行失败");
        sqlite3_close(sqlite);
        return NO;        
    }

    //关闭数据库
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);
    return YES;
}

/**
 *  接口描述:查询数据
 *  参数:  sql:SQL语句
 *  返回值:[
    [“字段值1”,“字段值2”,“字段值3”],
    [“字段值1”,“字段值2”,“字段值3”],
    [“字段值1”,“字段值2”,“字段值3”],
  ]
 */
//SELECT username,password,email FROM User
- (NSMutableArray *)selectData:(NSString *)sql columns:(int)number {
    sqlite3 *sqlite = nil;
    sqlite3_stmt *stmt = nil;
    
    //打开数据库
    if (sqlite3_open([self.filePath UTF8String], &sqlite) != SQLITE_OK) {
        NSLog(@"打开数据库失败");
        sqlite3_close(sqlite);
        return NO;
    }
    
    //编译SQL语句
    if (sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL) != SQLITE_OK) {
        NSLog(@"SQL语句编译失败");
        sqlite3_close(sqlite);
        return NO;
    }
    
    //查询数据
    int result = sqlite3_step(stmt);
    NSMutableArray *data = [NSMutableArray array];
    while (result == SQLITE_ROW) {
        NSMutableArray *row = [NSMutableArray arrayWithCapacity:3];
        for (int i=0; i<number; i++) {
            char *columnText = (char *)sqlite3_column_text(stmt, i);
            NSString *string = [NSString stringWithCString:columnText encoding:NSUTF8StringEncoding];
            [row addObject:string];
        }
        [data addObject:row];        
        result = sqlite3_step(stmt);
    }

    //关闭数据库
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);
    return data;
}
@end 

 

 如何使用这些接口呢?

具体例子:

#import "UserDB.h"
static UserDB *instnce;
@implementation UserDB
+ (id)shareInstance {/*单例模式*/
    if (instnce == nil) {
        instnce = [[[self class] alloc] init];
    }
    return instnce;
}

- (void)createTable {
    NSString *sql = @"CREATE TABLE IF NOT EXISTS User (username TEXT primary key,password TEXT,age TEXT);";
    [self createTable:sql];
}

- (BOOL)addUser:(UserModel *)userModel {
    NSString *sql = @"INSERT OR REPLACE INTO User (username,password,age) VALUES (?,?,?)";
    NSArray *params = [NSArray arrayWithObjects:userModel.username,
                                                userModel.password,
                                                userModel.age, nil];    
    return [self dealData:sql paramsarray:params];
}

- (NSArray *)findUsers {
    NSString *sql = @"SELECT username,password,age FROM User";
    NSArray *data = [self selectData:sql columns:3];
    NSMutableArray *users = [NSMutableArray array];
    for (NSArray *row in data) {
        NSString *username = [row objectAtIndex:0];
        NSString *password = [row objectAtIndex:1];
        NSString *age = [row objectAtIndex:2];        
        UserModel *user = [[UserModel alloc] init];
        user.username = username;
        user.password = password;
        user.age = age;
        [users addObject:user];
        [user release];
    }    
    return users;
}

@end

 

 

 

分享到:
评论

相关推荐

    ios-OC -- 用Collection加签喜好管理.zip

    在这个项目中,我们可能会看到如何创建自定义的UICollectionViewCell来代表用户的喜好或频道,以及如何通过UICollectionViewDataSource和UICollectionViewDelegate方法填充和响应用户与视图的交互。 其次,喜好管理...

    FMDB使用demo

    **FMDB是iOS平台上一个非常流行的SQLite数据库管理库,它为Objective-C提供了SQLite数据库操作的简单接口。在本文中,我们将深入探讨如何在iOS应用中使用FMDB进行数据存储,包括数据库的创建、数据表的建立、数据的...

    境界吧App源码

    5. **数据管理**:尽管没有具体的数据接口,但iOS应用通常需要处理数据存储,这可能涉及到Core Data(苹果的ORM框架)或者SQLite数据库,或者是本地文件系统操作。 6. **网络请求**:App通常需要与服务器交互获取...

    StudentManager.zip

    本项目,名为"StudentManager",是武汉大学软件工程课程中,由oc高建华和赵小刚同学共同完成的大作业,其核心是采用Swift编程语言构建一个学生学籍管理系统。通过这个系统,可以实现对学生的基本信息、成绩、出勤等...

    iOS生活小管家Demo

    《iOS生活小管家Demo》是一款基于Objective-C(OC)开发的应用程序,旨在为用户日常生活提供便利。这款应用包含了多项实用功能,如本地缓存管理...源码可供参考,对于学习和提升iOS开发技能来说,这是一个宝贵的资源。

    留言板demo

    在这个特定的案例中,由于提到是用Objective-C(简称OC)编写的,我们可以推测这是一个iOS或macOS平台上的应用。Objective-C是一种面向对象的编程语言,广泛用于Apple的开发环境,如Xcode。 首先,我们要理解留言板...

Global site tag (gtag.js) - Google Analytics