sqlite获取所有表的代码实现

 sqlite获取所有表的代码实现,注意这里不要使用FMDB,直接使用sqlite的c函数

{
    sqlite3 *_db;
    BOOL _isOpen;
}

- (void)upgradeDBFromVersion0 {
    int status = [self openDB];
    if (status == SQLITE_OK) {
        NSLog(@"--开始升级db");
        _isOpen = YES;
        NSArray *allTables = [self getAllTables];
        for (NSString *tableName in allTables) {
            if ([tableName containsString:@"courseware_"] ||
                [tableName containsString:@"messageData_"] ||
                [tableName containsString:@"note_"]) {
                // 做迁移
                NSString *addColumnSql = [NSString stringWithFormat:@"alter table %@ add clearIndex INTEGER default 0 not null", tableName];
                int addColumeExecStatus = sqlite3_exec(_db, addColumnSql.UTF8String,NULL, NULL, NULL);
                if (addColumeExecStatus == SQLITE_OK) {
                    NSLog(@"--添加字段成功");
                }
                else {
                    NSLog(@"--添加字段失败");
                }
            }
        }
        int closeStatus = [self closeDB];
        if (closeStatus == SQLITE_OK) {
            NSLog(@"--关闭数据库成功");
        }
        else {
            NSLog(@"--关闭数据库失败");
        }
    }
    else {
        NSLog(@"--db打开失败");
    }
}

- (NSArray *)getAllTables {
    // 获取所有的需要升级的表名,注意:这里直接使用sqlite3的c函数,使用FMDB的话得不到想要的结果
    NSMutableArray *mArr = [[NSMutableArray alloc] init];
    NSString * sql = @"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
    //2.执行语句

    //        int status = sqlite3_exec(_db, sql.UTF8String,NULL, NULL, NULL);
    //        NSLog(@"****%d", status);

    sqlite3_stmt * stmt = NULL;
    int res = sqlite3_prepare(_db, sql.UTF8String, -1, &stmt, NULL);
    if (res==SQLITE_OK) {
       NSLog(@"预处理成功");
       //3.一条条读数据
       while (sqlite3_step(stmt)==SQLITE_ROW) {
//               char * type = (char *) sqlite3_column_text(stmt, 0);
//               char * name = (char *) sqlite3_column_text(stmt, 1);
//               char * tbl_name = (char *) sqlite3_column_text(stmt, 2);
//               NSLog(@"------%s,%s,%s",type,name,tbl_name);
           char *name = (char *) sqlite3_column_text(stmt, 0);
           [mArr addObject:[NSString stringWithUTF8String:name]];
           NSLog(@"------%s", name);
       }
    }else{
       NSLog(@"预处理失败");
    }
    //释放开辟的内存空间
    sqlite3_finalize(stmt);
    NSLog(@"%@", mArr);
    return mArr.copy;
}

- (int)openDB {
    NSString *dbFilePath = [DBClient shareInstance].getDBFilePath;
    _db = NULL;
    int openStatus = sqlite3_open(dbFilePath.UTF8String, &_db);
    return openStatus;
}

- (int)closeDB {
    if (_isOpen) {
        int status = sqlite3_close(_db);
        return status;
    }
    return -1;
}

猜你喜欢

转载自blog.csdn.net/allanGold/article/details/109307692
今日推荐