데이터베이스에 이미지를 저장하고 맞춤 카메라를 만들기 위해 av 캡처 세션을 사용 중입니다. 그러나 데이터베이스에 점점 더 많은 이미지를 저장하면 메모리 경고가 발생합니다.ios에서의 메모리 문제
데이터베이스에 이미지 저장을 중단하면 응용 프로그램이 제대로 작동합니다. 왜 그런 일이 발생합니까? 그것은 데이터베이스의 크기가 증가하기 때문에 발생합니까?
현재 코드 :
-(void)insert
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"dbsqlite.sqlite"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
////////\\
for (jk=0; jk<[globalvalue count];jk++)
{
NSData *imgData = UIImagePNGRepresentation((UIImage *)[globalvalue objectAtIndex:jk]);
const char *query = "insert into color(img) values (?)";
sqlite3_stmt *searchStatement2;
if (sqlite3_prepare_v2(database,query, -1, &searchStatement2, NULL) == SQLITE_OK)
{
sqlite3_bind_blob(searchStatement2,1, [imgData bytes], [imgData length], NULL);
if (sqlite3_step(searchStatement2) == SQLITE_DONE)
{
NSLog(@"saved");
}
//
// while (sqlite3_step(searchStatement2) == SQLITE_ROW)
// {
// NSString *name2 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement2, 0)];
// NSString *category2 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement2, 1)];
// NSLog(@"%@ is a %@ color", name, category);
//
//
// }
}
sqlite3_finalize(searchStatement2);
}
}
[[[UIAlertView alloc]initWithTitle:@"alert" message:@"your query saved" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil] show];
sqlite3_close(database);
}
- (void)makeDBCopyAsNeeded
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"dbsqlite.sqlite"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success)
{
return;
}
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"dbsqlite.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success)
{
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
}
-(void)readFromDatabase
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"dbsqlite.sqlite"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
const char *sqlStatement="select img,rowID from color";
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL)==SQLITE_OK)
{
while (sqlite3_step(compiledStatement)==SQLITE_ROW)
{
NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement,0) length:sqlite3_column_bytes(compiledStatement,0)];
if(data == nil)
NSLog(@"No image found.");
else
{
UIImage *personImage= [UIImage imageWithData:data];
NSString *rowid1=[NSString stringWithFormat:@"%d", sqlite3_column_int(compiledStatement,1)];
[rowid addObject:rowid1];
[arrImageFromDataBase addObject:personImage];
// NSData *data = [NSData dataWithBytes:sqlite3_column_blob(compiledStatement, 4) length:length];
NSLog(@"%@",personImage);
}
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
NSLog(@"contents of array%@",rowid);
}
그것은 조금 ... 혼란을 끼쳐 드려 미안하지만 정말 도움이 필요합니다!
ARC를 사용합니까? 영어를 정리했습니다. – Raptor
나는 호를 사용합니다. – mandeep
데이터베이스에 이미지를 저장하는 것이 적절한 방법이 아닙니다. –