• 分享一段ios数据库代码,包括对表的创建、升级、增删查改


     

    分享一段ios数据库代码。包括创建、升级、增删查改。

    里面的那些类不必细究,主要是数据库的代码100%可用。

    数据库升级部分,使用switch,没有break,低版本一次向高版本修改。

    //  DB.h
    //iukey
    #import <Foundation/Foundation.h>
    #import "sqlite3.h"
    #import "User.h"
    #import "ChatInfo.h"
    #import "DescInfo.h"
    @interface DBHelper : NSObject{
        sqlite3* db;//数据库句柄
    //   @public DBHelper *instance;
    }
    
    @property(nonatomic,assign)sqlite3* db;
    - (BOOL)insertUserWithTUsersName:(NSString*)name account:(NSString*)account pwd:(NSString*)pwd;
    - (NSMutableArray*)quary:(NSString*)str;//查询
    
    - (NSString*)getFilePath;//获取数据库路径
    - (BOOL)createDB;//创建数据库
    - (BOOL)createTable:(NSString*) creteSql;//创建表
    - (User*)getUserWithTUsersByAccount:(NSString* )account;
    - (BOOL)updateUserPwdWithTUsers:(NSString*)pwd byAccount:(NSString*)account ;
    //+ (DBHelper*) getDBhelperInstance;
    - (BOOL)deleteItemWithTable:(NSString*)table_ ByKey:(NSString*)key_ ;
    -(BOOL)insertChatRecordWithTChatRecordByChatInfo:(ChatInfo*)ci owner:(NSString *)owner;
    - (int)getRecordCountWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid owner:(NSString *)owner;
    - (NSMutableArray*)getChatInfoWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid fromIndex:(int)fromIndex count:(int)count owner:(NSString *)owner;
    - (BOOL)deleteChatInfoWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid owner:(NSString *)owner;
    
    -(NSMutableDictionary*)getRecordCountNotREadWithTChatRecord:(NSString*)toJid owner:(NSString *)owner;
    -(BOOL)updateRecordCountNotReadWithChatRecord:(NSString *)fromJid;
    -(NSMutableArray*)getRecordNotReadWithTChatRecordFromJid:(NSString*)fromJid owner:(NSString *)owner;
    //history
    -(BOOL)insertHistoryRecordWithTHistoryRecordByDescInfo:(DescInfo*)di account:(NSString*)account routerjid:(NSString *)routerjid;
    - (NSMutableArray*)getHistoryRecordWithTHistoryRecordByAccount:(NSString* )account routerjid:(NSString *)routerjid;
    - (BOOL)deleteHistoryWithTHistoryRecordByDeviceType:(NSString *)deviceType account:(NSString* )account routerjid:(NSString *)routerjid;
    - (BOOL)deleteHistoryWithTHistoryRecordById:(int)c_id account:(NSString* )account routerjid:(NSString *)routerjid;
    - (NSMutableArray*)getHistoryRecordWithTHistoryRecordByUDN:(NSString* )UDN withAccount:(NSString* )account routerjid:(NSString *)routerjid;
    -(BOOL)updateHistoryCountNotReadWithHistoryRecordByDeviceType:(NSString *)deviceType account:(NSString* )account routerjid:(NSString *)routerjid;
    -(int)getHistoryCountNotReadWithHistoryRecordByAccount:(NSString *)account routerjid:(NSString *)routerjid;
    
    @end
    //  DB.m
    //iukey
    #import "DBHelper.h"
    #import "YHConfig.h"
    #import "DescInfo.h"
    #import "FromJid.h"
    // tid ----table index id
    @implementation DBHelper
    
    static  NSString *createTB_user=@"create table if not exists t_users (c_account text primary key ,c_name text,c_pwd text)";
    
    /*
     info_ key-value
     db_version --1
     ...
     */
    static  NSString *createTB_info=@"create table if not exists t_info (c_key text primary key ,c_value text)";
    /*
     c_time 存储1970秒数
     */
    static  NSString *createTB_chat_record=@"create table if not exists t_chat_record (c_id integer primary key autoincrement,c_from_jid text,c_to_jid text,c_chat_time integer,c_msg text,c_has_read integer)";
    
    
    
    static NSString *createTB_history_record=@"create table if not exists t_history_record (c_id integer primary key autoincrement,c_deviceType text,c_UDN text,c_friendlyName text,c_history_time integer,c_desc text)";
    
    @synthesize db;
    
    - (id)init{
        self = [super init];    
        int dbVersion =0;
        //检查是否存在数据库文件
        if (![self isExistDB]) {
            //不存在,则创建
             [self createDB];
        }else {
            //若存在,检测数据库版本,则进行升级,
    
            char* info=NULL;
            [self getDBInfoValueWithKey:"db_version" value:&info];
            if(info == NULL){
                return self;
            }
            dbVersion= atoi(info);
            free (info);
            
            
        }
        //升级数据库。若第一次创建,则从0开始升级。顺序升级,因此不可以有break
        switch (dbVersion) {
            case 0:
                //第一次,新建并初始化各表
                [self createTable:createTB_user];
                //记录版本
                [self createTable:createTB_info];
                [self setDBInfoValueWithKey:"db_version" value:"1"];            
                [self createTable:createTB_chat_record];
                [self createTable:createTB_history_record];            
            case 1:
                [self setDBInfoValueWithKey:"db_version" value:"2"];
            case 2:
            {
                NSString *modify=@"alter table t_history_record add column c_user text not null default ''";
                [self setDBInfoValueWithKey:"db_version" value:"3"];
                [self execSql:modify];
            }
            case 3:
            {
                NSString *modify=@"alter table t_chat_record add column c_owner text not null default ''";
                [self setDBInfoValueWithKey:"db_version" value:"4"];
                [self execSql:modify];
            }
            case 4:
            {
                NSString *modify=@"alter table t_history_record add column c_router text not null default ''";
                [self setDBInfoValueWithKey:"db_version" value:"5"];
                [self execSql:modify];
            }
            case 5:
            {
                NSString *modify=@"alter table t_history_record add column c_has_read integer not null default ''";
                [self setDBInfoValueWithKey:"db_version" value:"6"];
                [self execSql:modify];
            }
                //注:数据库升级时候,只需要一次添加case即可,同时更新<span style="font-family: Arial, Helvetica, sans-serif;">db_version值</span>
            /*
            case 3:
            {
             //先不加密
                //1、将db文件移至portrait,并重命名yunho.db->_yunho.png
                //2、得到所有的密码,使用base64存储
                //3、用户名输入时候能自动检测是否有匹配的密码并实时的显示
                
    //            NSString *modify=@"alter table t_history_record add column c_user text not null default ''";
    //            [self setDBInfoValueWithKey:"db_version" value:" 4"];
    //            [self execSql:modify];
            }
             */
            default:
                break;
        }
        return self;
    }
    
    
    - (NSString*)getFilePath{//get db path
        NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask  , YES); 
        NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:[YHConfig DBName ]];
        return databaseFilePath ;
    }
    
    #pragma mark db manage
    - (BOOL)createDB{
        int ret = sqlite3_open([[self getFilePath] UTF8String], &db);//打开数据库,数据库不存在则创建
        if (SQLITE_OK == ret) {//创建成功
            sqlite3_close(db);//关闭
            return YES;
        }else{
            return NO;//创建失败
        }
    }
    -(BOOL) isExistDB{
        NSFileManager* fm = [[[NSFileManager alloc] init]autorelease];
        return [fm fileExistsAtPath:[self getFilePath] ];
    }
    /*
     create table dictionary(ID integer primary key autoincrement,en nvarchar(64),cn nvarchar(128),comment nvarchar(256))
     */
    - (BOOL)dropTableWithTableName:(NSString*) tableName{
        NSString* dropSql = [[NSString alloc] initWithFormat:@"delete table %@",tableName];
        return [self execSql:[dropSql autorelease]];
    }
    - (BOOL)createTable:(NSString*) creteSql{
        return [self execSql:creteSql];
       }
    -(BOOL) execSql:(NSString*) creteSql{
        char* err;
        const char* sql = [creteSql UTF8String];//创建表语句
        if (sql==NULL) {
            return NO;
        }
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){
            return NO;
        }
        
        if (SQLITE_OK == sqlite3_exec(db, sql, NULL, NULL, &err)) {//执行创建表语句成功
            sqlite3_close(db);
            return YES;
        }else{//创建表失败
            return NO;
        }
    
    }
    //"select * from dictionary where en like ? or cn like ? or comment like ?;";//查询语句
    //TODO
    - (NSMutableArray*)quary:(NSString *) querySql{
        
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){
            return nil;
        }    
        const char* sql = [querySql UTF8String];//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, 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;
        }
        NSMutableArray* arr =[[NSMutableArray alloc]init];//存放查询结果
        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];//插入到结果数组
            [dict release];
        }
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return [arr autorelease];//返回查询结果数组
    }
    
    
    #pragma mark  table t_info manage
    - (void)getDBInfoValueWithKey:(const char*)key value:(char**)value{
        //TODO
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            printf("%s:%d query error..
    ",__FUNCTION__,__LINE__);
            return ;
        }
        const char* sql = "select * from t_info where c_key =?";//查询语句
        sqlite3_stmt* stmt;
        
        
        int error = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        if (error==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1,key, -1, NULL);
        }else{
            printf("%s:%d query error.. %d
    ",__FUNCTION__,__LINE__,error);
            return;
        }
        
        
        if( SQLITE_ROW == sqlite3_step(stmt) ){//执行
             char* v= (char*)sqlite3_column_text(stmt, 1);
            *value = strdup(v);
            
        }
        sqlite3_finalize(stmt);
        sqlite3_close(db);
    }
    - (BOOL)setDBInfoValueWithKey:(const char*)key value:(const char*)value {
        char* info=NULL;
        [self getDBInfoValueWithKey:key value:&info];
        if (info!= NULL) {
            //存在,则更新
            [self updateDBInfoValueWithKey:key value:value];
        }else{
            //不存在,插入
            [self insertDBInfoValueWithKey:key value:value];
            
        }
        free(info);
        return YES;
    }
    
    - (BOOL)insertDBInfoValueWithKey:(const char*)key value:(const char*)value{
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){
            return NO;
        }
        const char* sql = "insert into t_info(c_key,c_value) values(?,?);";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, key, -1, NULL);//绑定参数
            sqlite3_bind_text(stmt, 2, value, -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    
    
    - (BOOL)updateDBInfoValueWithKey:(const char*)key value:(const char*)value{
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){
            return NO;
        }
        const char* sql = "update t_info set c_value = ? where c_key = ?;";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, value, -1, NULL);
            sqlite3_bind_text(stmt, 2, key, -1, NULL);
        }else{
            return NO;
        }
        ret = sqlite3_step(stmt);
        printf("ret:%d
    ",ret);
        if (SQLITE_DONE ==ret ) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    
    
    
    #pragma mark table "t_users" manage
    - (User*)getUserWithTUsersByAccount:(NSString* )account{
        
        
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        
        const char* sql = "select * from t_users where c_account = ?";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1,[account UTF8String], -1, NULL);
        }else{
            return nil;
        }
        User* user = nil;
        if( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            user = [[[User alloc]init]autorelease];
            NSString *name=nil;
            NSString *pwd= nil;
            if (sqlite3_column_text(stmt, 0) != NULL) {
                name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)];
                
            }
            if (sqlite3_column_text(stmt,2 ) != NULL) {
                pwd = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)];
            }
            
            
            user.name =name;
            user.account= account;
            user.pwd = pwd;
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  user;
    }
    
    
    - (BOOL)insertUserWithTUsersName:(NSString*)name account:(NSString*)account pwd:(NSString*)pwd{
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        const char* sql = "insert into t_users(c_name,c_account,c_pwd) values(?,?,?);";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);//绑定参数
            sqlite3_bind_text(stmt, 2, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [pwd UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    
    //根据account 修改用户 的name和pwd
    - (BOOL)updateUserPwdWithTUsers:(NSString*)pwd byAccount:(NSString*)account {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        const char* sql = "update t_users set c_pwd = ? where c_account = ?";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [pwd UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [account UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    #pragma mark table "t_chat_record" manage
    -(BOOL)insertChatRecordWithTChatRecordByChatInfo:(ChatInfo*)ci owner:(NSString *)owner{
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        //@"create table if not exists t_chat_record (c_id text primary key ,c_from_jid text,c_to_jid text,c_chat_time integer,c_msg text)";
        const char* sql = "insert into t_chat_record(c_from_jid,c_to_jid,c_chat_time,c_msg,c_has_read,c_owner) values(?,?,?,?,?,?);";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [[ci fromJid] UTF8String], -1, NULL);//绑定参数
            sqlite3_bind_text(stmt, 2, [[ci toJid] UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 3, (int)[ci.chatTime timeIntervalSince1970] );
            sqlite3_bind_text(stmt, 4, [ci.msg UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 5, [ci hasRead]);
            sqlite3_bind_text(stmt, 6, [owner UTF8String], -1, NULL);
            log4debug(@"%d",[ci hasRead]);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    
    }
    //update the count of chat record not read
    -(BOOL)updateRecordCountNotReadWithChatRecord:(NSString *)fromJid
    {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        const char* sql = "update t_chat_record set c_has_read = 1 where c_from_jid = ?";//修改语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
                sqlite3_bind_text(stmt, 1, [fromJid UTF8String], -1, NULL);
              
            }else{
                return nil;
            }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    
           
    }
    
    -(NSMutableArray*)getRecordNotReadWithTChatRecordFromJid:(NSString*)fromJid owner:(NSString *)owner{
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        const char* sql = "select c_chat_time,c_msg from t_chat_record where c_has_read = 0 and c_from_jid =? and c_owner =? order by c_chat_time asc";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
           sqlite3_bind_text(stmt, 1,[fromJid UTF8String], -1, NULL);
           sqlite3_bind_text(stmt, 2,[owner UTF8String], -1, NULL);
        }else{
            return nil;
        }
        
        NSMutableArray* msgs=[[[NSMutableArray alloc]init]autorelease];
        while ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            NSString *msg=nil;
            int chatTime = 0;
            if (sqlite3_column_text(stmt, 1) != NULL) {
                msg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)];
                
            }
            chatTime = sqlite3_column_int(stmt, 0);
            NSDate * showTime = [NSDate dateWithTimeIntervalSince1970:chatTime];
            [msgs addObject:showTime];
            [msgs addObject:msg];
    
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return msgs ;
    }
    
    //get the count of the chat record not read
    -(NSMutableDictionary*)getRecordCountNotREadWithTChatRecord:(NSString*)toJid owner:(NSString *)owner
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        const char* sql = "select c_from_jid, count(*) from t_chat_record where c_has_read = 0 and c_to_jid =? and c_owner =? group by c_from_jid ";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
                 sqlite3_bind_text(stmt, 1,[toJid UTF8String], -1, NULL);
                 sqlite3_bind_text(stmt, 2,[owner UTF8String], -1, NULL);
        }else{
            return nil;
        }
        
        NSMutableDictionary* fis=[[[NSMutableDictionary alloc]init]autorelease];
        while ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
           FromJid* fi  = [[[FromJid alloc]init]autorelease];
            NSString *fromJid=nil;
            int noReadCount = 0;
            
            
            if (sqlite3_column_text(stmt, 0) != NULL) {
                fromJid = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)];
            }
            noReadCount = sqlite3_column_int(stmt, 1);
            
            fi.fromJid = fromJid;
            fi.noReadCount = noReadCount;
            [fis setObject:fi forKey:fi.fromJid];
        }
    
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return fis ;
    
    }
    
    //get the count of the chat record
    - (int)getRecordCountWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid owner:(NSString *)owner
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        //static  NSString *createTB_chat_record=@"create table if not exists t_chat_record (c_id integer primary key autoincrement,c_from_jid text,c_to_jid text,c_chat_time integer,c_msg text)";
        //不区分from&to,因此两个条件查询
        const char* sql = "select count (*) from t_chat_record where ((c_from_jid = ? and c_to_jid=?) or  (c_from_jid = ? and c_to_jid=?)) and c_owner = ?";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 4,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 5,[owner UTF8String], -1, NULL);
        }else{
            return nil;
        }
        int count=0;
        if ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            count=sqlite3_column_int(stmt, 0);
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  count ;
    }
    
    - (NSMutableArray*)getChatInfoWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid fromIndex:(int)fromIndex count:(int)count owner:(NSString *)owner
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        //static  NSString *createTB_chat_record=@"create table if not exists t_chat_record (c_id integer primary key autoincrement,c_from_jid text,c_to_jid text,c_chat_time integer,c_msg text)";
        //不区分from&to,因此两个条件查询  
        const char* sql = "select * from t_chat_record where ((c_from_jid = ? and c_to_jid=?) or  (c_from_jid = ? and c_to_jid=?)) and c_owner = ? order by c_chat_time asc limit ?,?  ";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备 
            sqlite3_bind_text(stmt, 1,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 4,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 5,[owner UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 6, fromIndex);
            sqlite3_bind_int(stmt, 7, count);
        }else{
            return nil;
        }
        NSMutableArray *cis=[[[NSMutableArray alloc]initWithCapacity:3]autorelease];
        while ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            ChatInfo* ci  = [[[ChatInfo alloc]init]autorelease];
            NSString *fromJid=nil;
            NSString *toJid= nil;
            NSString *msg=nil;      
            int time = 0;
            if (sqlite3_column_text(stmt, 1) != NULL) {
                fromJid = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)];
            }
            if (sqlite3_column_text(stmt,2 ) != NULL) {
                toJid = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)];
            }
            if (sqlite3_column_text(stmt,3 ) != NULL) {
                time = sqlite3_column_int(stmt, 3);
            }
            if (sqlite3_column_text(stmt,4 ) != NULL) {
                msg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 4)];
            }
            ci.fromJid=fromJid;
            ci.toJid=toJid;
            ci.chatTime=[NSDate dateWithTimeIntervalSince1970:time];
            ci.msg=msg;
            [cis addObject:ci];
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  cis ;
    }
    
    - (BOOL)deleteChatInfoWithTChatRecordByoneJid:(NSString* )oneJid anotherJid:(NSString* )anotherJid owner:(NSString *)owner
    {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        NSString* sql = [NSString stringWithFormat:@"delete from t_chat_record where ((c_from_jid = ? and c_to_jid=?) or  (c_from_jid = ? and c_to_jid=?)) and c_owner = ?"];
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3,[anotherJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 4,[oneJid UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 5,[owner UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
        
    }
    
    #pragma mark table "t_history_record" manage
    -(BOOL)insertHistoryRecordWithTHistoryRecordByDescInfo:(DescInfo*)di account:(NSString*)account routerjid:(NSString *)routerjid{
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        //@"create table if not exists t_history_record (c_id text primary key ,c_deviceType text,c_UDN text,c_friendlyName text,c_history_time integer,c_desc text)";
        const char* sql = "insert into t_history_record(c_deviceType,c_UDN,c_friendlyName,c_history_time,c_desc,c_user,c_router,c_has_read) values(?,?,?,?,?,?,?,?);";
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [[di deviceType] UTF8String], -1, NULL);//绑定参数
            sqlite3_bind_text(stmt, 2, [[di deviceUDN] UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [[di friendlyName] UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 4, (int)[di.time timeIntervalSince1970] );
            sqlite3_bind_text(stmt, 5, [di.deviceDesc UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 6, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 7, [routerjid UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 8, [di hasRead]);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
        
    }
    - (NSMutableArray*)getHistoryRecordWithTHistoryRecordByUDN:(NSString* )UDN withAccount:(NSString* )account routerjid:(NSString *)routerjid
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        const char* sql = "select * from t_history_record where c_UDN = ? and c_user =? and c_router =? order by c_history_time desc";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1,[UDN UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2,[account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3,[routerjid UTF8String], -1, NULL);
        }else{
            return nil;
        }
        NSMutableArray *dis=[[[NSMutableArray alloc]initWithCapacity:5]autorelease];
        while ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            DescInfo* di  = [[[DescInfo alloc]init]autorelease];
            NSString* deviceType = nil;
            NSString* friendlyName= nil;
            NSString* deviceUDN= nil;
            NSString* deviceDesc= nil;
            NSDate* time= nil;
            int c_id = 0;
            if (sqlite3_column_text(stmt, 0) != NULL) {
                c_id = sqlite3_column_int(stmt, 0);
                
            }
            if (sqlite3_column_text(stmt, 1) != NULL) {
                deviceType = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)];
            }
            if (sqlite3_column_text(stmt,2 ) != NULL) {
                deviceUDN = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)];
            }
            if (sqlite3_column_text(stmt,3 ) != NULL) {
                friendlyName = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 3)];
            }
            if (sqlite3_column_text(stmt,4 ) != NULL) {
                int i  = sqlite3_column_int(stmt, 4);
                time = [NSDate dateWithTimeIntervalSince1970:i];
                //            time = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 4)];
            }
            if (sqlite3_column_text(stmt,5 ) != NULL) {
                deviceDesc = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 5)];
            }
            di.deviceType=deviceType;
            di.deviceUDN=deviceUDN;
            di.friendlyName=friendlyName;
            di.time = time;
            di.deviceDesc =deviceDesc;
            di.c_id = c_id;
            [dis addObject:di];
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  dis ;
    
    
    }
    - (NSMutableArray*)getHistoryRecordWithTHistoryRecordByAccount:(NSString* )account routerjid:(NSString *)routerjid
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        const char* sql = "select * from t_history_record where c_user = ? and c_router = ? order by c_history_time desc";//查询语句
        sqlite3_stmt* stmt;
        if (sqlite3_prepare_v2(db, sql, -1, &stmt, nil)==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1,[account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2,[routerjid UTF8String], -1, NULL);
        }else{
            return nil;
        }
        NSMutableArray *dis=[[[NSMutableArray alloc]initWithCapacity:5]autorelease];
        while ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
           DescInfo* di  = [[[DescInfo alloc]init]autorelease]; 
            NSString* deviceType = nil;
             NSString* friendlyName= nil;
              NSString* deviceUDN= nil;
             NSString* deviceDesc= nil;
            NSDate* time= nil;
            int c_id = 0;
            if (sqlite3_column_text(stmt, 0) != NULL) {
                c_id = sqlite3_column_int(stmt, 0);
                
            }
            if (sqlite3_column_text(stmt, 1) != NULL) {
                deviceType = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)];
            }
            if (sqlite3_column_text(stmt,2 ) != NULL) {
               deviceUDN = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)];
            }
            if (sqlite3_column_text(stmt,3 ) != NULL) {
                friendlyName = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 3)];
            }
            if (sqlite3_column_text(stmt,4 ) != NULL) {
                int i  = sqlite3_column_int(stmt, 4);
                time = [NSDate dateWithTimeIntervalSince1970:i];
    //            time = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 4)];
            }
            if (sqlite3_column_text(stmt,5 ) != NULL) {
                deviceDesc = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 5)];
            }
            di.deviceType=deviceType;
            di.deviceUDN=deviceUDN;
            di.friendlyName=friendlyName;
            di.time = time;
            di.deviceDesc =deviceDesc;
            di.c_id = c_id;
            [dis addObject:di];
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  dis ;
    
    
    }
    - (BOOL)deleteHistoryWithTHistoryRecordByDeviceType:(NSString *)deviceType account:(NSString* )account routerjid:(NSString *)routerjid
    {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        NSString* sql = [NSString stringWithFormat:@"delete from t_history_record where c_deviceType = ? and c_user = ? and c_router = ?"];
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [deviceType UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [routerjid UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    - (BOOL)deleteHistoryWithTHistoryRecordById:(int)c_id account:(NSString* )account routerjid:(NSString *)routerjid
    
    {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
        NSString* sql = [NSString stringWithFormat:@"delete from t_history_record where c_id = ? and c_user = ? and c_router = ?"];
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
    //        sqlite3_bind_text(stmt, 1, [c_id UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 1, c_id);
            sqlite3_bind_text(stmt, 2, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [routerjid UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    
    }
    
    //update the count of history record not read
    -(BOOL)updateHistoryCountNotReadWithHistoryRecordByDeviceType:(NSString *)deviceType account:(NSString* )account routerjid:(NSString *)routerjid
    {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        NSString * sql = [NSString stringWithFormat:@"update t_history_record set c_has_read = 1 where c_deviceType = ? and c_user = ? and c_router = ?"];//查询语句
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1, [deviceType UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [routerjid UTF8String], -1, NULL);
        }else{
            return nil;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    
    -(int)getHistoryCountNotReadWithHistoryRecordByAccount:(NSString *)account routerjid:(NSString *)routerjid
    {
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String] , &db)){
            return nil;
        }
        NSString * sql = [NSString stringWithFormat:@"select count (*) from t_history_record where c_has_read = 0 and c_user = ? and c_router = ?"];//查询语句
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备
            sqlite3_bind_text(stmt, 1, [account UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [routerjid UTF8String], -1, NULL);
        }else{
            return nil;
        }
        int count=0;
        if ( SQLITE_ROW == sqlite3_step(stmt) ){//执行
            count=sqlite3_column_int(stmt, 0);
        }
        
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return  count ;
    }
    
    #pragma mark manage normal tables
    - (BOOL)deleteItemWithTable:(NSString*)table_ ByKey:(NSString*)key_ {
        int ret = 0;
        if (SQLITE_OK != sqlite3_open([[self getFilePath] UTF8String], &db)){//打开数据库
            return NO;
        }
    
        NSString* sql= [NSString stringWithFormat:@"delete from  %@  where  c_account =  ?",table_]; 
        
        sqlite3_stmt* stmt;//
        int result =sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        printf("%s
    ",sqlite3_errmsg(db));
        if (result==SQLITE_OK) {//准备语句
            sqlite3_bind_text(stmt, 1, [key_ UTF8String], -1, NULL);
        }else{
            return NO;
        }
        if (SQLITE_DONE == (ret = sqlite3_step(stmt))) {//执行查询
            sqlite3_finalize(stmt);
            sqlite3_close(db);
            return YES;
        }else{
            return NO;
        }
    }
    
    
    
    
    
    
    
    @end

    转:http://blog.csdn.net/kafeidev/article/details/17028423

  • 相关阅读:
    欧拉筛,线性筛,洛谷P2158仪仗队
    树形DP和状压DP和背包DP
    洛谷P1144最短路计数题解
    洛谷P1373小a和uim大逃离题解
    LCA
    108. Convert Sorted Array to Binary Search Tree
    230. Kth Smallest Element in a BST
    94. Binary Tree Inorder Traversal
    144. Binary Tree Preorder Traversal
    236. Lowest Common Ancestor of a Binary Tree
  • 原文地址:https://www.cnblogs.com/ygm900/p/3570849.html
Copyright © 2020-2023  润新知