【问题标题】:iOS FMDB Sqlite wrapper. Out of memoryiOS FMDB Sqlite 包装器。记不清
【发布时间】:2012-08-05 09:58:50
【问题描述】:

以下代码:

-(NSArray *)getContentsWithContextTypes:(NSArray *)contextTypes
                            contextData:(NSArray *)contextData
{
    __block NSString *query = @"SELECT * FROM Texts_original1 WHERE ";
    [contextData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *attributeName = [self.contextTypeToDBQueryTexts          
                                        objectForKey:contextTypes[idx]];
        query = [query stringByAppendingFormat:@"%@ = \"%@\"", attributeName, obj];
        if(idx != contextData.count - 1)
        {
            query = [query stringByAppendingString:@" AND "];
        }
    }];

    [self.db open];
    FMResultSet *results = [self.db executeQuery:query];
    NSMutableArray *array = [NSMutableArray array];

    while([results next])
    {
        Content *content = [[TextualContent alloc] initWithResults:results];
        [array addObject:content];
    }

    [self.db close];
    return array;
}

运行时产生以下错误:

调用 sqlite3_step 时出错(21:内存不足)rs

它发生在循环的一半。应该有 33 个结果。 17 之后我得到那个错误并且循环退出。有任何想法吗?谢谢。

【问题讨论】:

    标签: ios sqlite memory fmdb


    【解决方案1】:

    了解您关闭 FMResultSet 对象很重要,因为它会导致内存问题。 如下操作,[resultSet close]

    我没有进入你的代码逻辑,但是,我将对数据库代码进行一些修改。

    尝试以下方法:

    -(NSArray *)getContentsWithContextTypes:(NSArray *)contextTypes
                            contextData:(NSArray *)contextData
    {
     __block NSString *query = @"SELECT * FROM Texts_original1 WHERE ";
     [contextData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
       {
         NSString *attributeName = [self.contextTypeToDBQueryTexts          
                                        objectForKey:contextTypes[idx]];
         query = [query stringByAppendingFormat:@"%@ = \"%@\"", attributeName, obj];
         if(idx != contextData.count - 1)
         {
            query = [query stringByAppendingString:@" AND "];
         }
      }];
    
    self.db = [FMDatabase databaseWithPath:[self getDBPath]];    
    
    if(![db open])
    {
      NSLog(@"Could not open DB");
      return nil;
    } 
    
    FMResultSet *results = [self.db executeQuery:query];
    NSMutableArray *array = [NSMutableArray array];
    
    while([results next])
    {
        Content *content = [[TextualContent alloc] initWithResults:results];
        [array addObject:content];
    }
    
    [results close]; //VERY IMPORTANT!
    [self.db close];
    return array;
    

    }

    【讨论】:

    • 好的,我去看看试试看。
    • 试试 www.github.com/pmurphyjam/DBExample 这是一个使用 Sqlite 的 Xcode 项目。它没有这些内存问题,并且可以执行 SQL 事务来编写大型查询。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2011-05-13
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多