2012-08-08 86 views
0

下面的代码:iOS FMDB Sqlite包装。内存不足。

错误调用sqlite3_step:当我运行它

-(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; 
} 

生成以下错误(21:内存不足)RS

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

回答

6

重要的是要知道你关闭 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; 

}

+0

不错,我会检查它,并有一个尝试。 – Autobots 2013-05-02 02:28:42

+0

试试www.github.com/pmurphyjam/DBExample这是一个使用Sqlite的Xcode项目。它没有这些内存问题,并且可以执行SQL事务来编写大型查询。 – Pat 2014-05-22 21:33:26