iOS FMDB Sqlite包装。内存不足。
问题描述:
下面的代码: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后,我得到该错误,并退出循环。有任何想法吗?谢谢。
答
重要的是要知道你关闭 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;
}
不错,我会检查它,并有一个尝试。 – Autobots 2013-05-02 02:28:42
试试www.github.com/pmurphyjam/DBExample这是一个使用Sqlite的Xcode项目。它没有这些内存问题,并且可以执行SQL事务来编写大型查询。 – Pat 2014-05-22 21:33:26