Iphone Sqlite崩溃应用程序
我正在使用此代码向表中插入名称,我有一个问题,即在150+/-名称后,应用程序会崩溃,并使用此日志:Iphone Sqlite崩溃应用程序,iphone,objective-c,sqlite,Iphone,Objective C,Sqlite,我正在使用此代码向表中插入名称,我有一个问题,即在150+/-名称后,应用程序会崩溃,并使用此日志: Received memory warning. Level=1 Received memory warning. Level=2 这是密码,我做错什么了吗 if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) { for (int i = 0 ; i < count; i++) {
Received memory warning. Level=1
Received memory warning. Level=2
这是密码,我做错什么了吗
if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
for (int i = 0 ; i < count; i++) {
sqlite3_stmt *insertStmt = nil;
NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];
if(insertStmt == nil)
{
NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
const char *insertSql = [statement UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
NSLog(@"Error while creating insert statement.");
insertStmt = nil;
continue;
}
sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insertStmt)){
NSLog(@"Error while inserting data.");
insertStmt = nil;
continue;
}
else{}
sqlite3_reset(insertStmt);
insertStmt = nil;
}
[delegate IPodLibraryFinishEntity:self];
}
sqlite3_close(database);
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
对于(int i=0;i
}使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot 有关如何使用Heapshot查找内存裂缝,请参阅: 基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存 要了解结果,请查看各个分配 如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具: 在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置
使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot 有关如何使用Heapshot查找内存裂缝,请参阅: 基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存 要了解结果,请查看各个分配 如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具: 在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置
在启动每个Insert语句之前,使用sqlite3\u open并在执行查询putsqlite3\u close语句之后。这样,在每次执行Insert查询之后,数据库对象就不会再忙碌。在启动每个Insert语句之前,请使用sqlite3\u open并在执行查询putsqlite3\u close语句之后。这样,在每次执行插入查询之后,数据库对象就不会再忙了。您的代码不是最优的。您应该将所有的prepare方法放在循环之前
if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
sqlite3_stmt *insertStmt = nil;
NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];
if(insertStmt == nil) {
NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
const char *insertSql = [statement UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
NSLog(@"Error while creating insert statement.");
insertStmt = nil;
return;
}
}
for (int i = 0 ; i < count; i++) {
sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insertStmt)){
NSLog(@"Error while inserting data.");
continue;
}
else{}
sqlite3_clear_bindings(insertStmt); //release bindings
sqlite3_reset(insertStmt);
[delegate IPodLibraryFinishEntity:self];
}
sqlite3_close(database);
}
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
sqlite3_stmt*insertStmt=nil;
NSString*name=[song valueForProperty:MPMediaItemPropertyTitle];
如果(insertStmt==nil){
NSString*语句=[NSString stringWithFormat:@“插入歌曲(名称)值(?)”;
const char*insertSql=[statement UTF8String];
if(sqlite3\u prepare\u v2(数据库,insertSql,-1,&insertStmt,NULL)!=SQLITE\u确定){
NSLog(@“创建insert语句时出错”);
insertStmt=nil;
返回;
}
}
对于(int i=0;i
您的代码不是最佳的。您应该将所有的prepare方法放在循环之前
if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
sqlite3_stmt *insertStmt = nil;
NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];
if(insertStmt == nil) {
NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
const char *insertSql = [statement UTF8String];
if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
NSLog(@"Error while creating insert statement.");
insertStmt = nil;
return;
}
}
for (int i = 0 ; i < count; i++) {
sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(insertStmt)){
NSLog(@"Error while inserting data.");
continue;
}
else{}
sqlite3_clear_bindings(insertStmt); //release bindings
sqlite3_reset(insertStmt);
[delegate IPodLibraryFinishEntity:self];
}
sqlite3_close(database);
}
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
sqlite3_stmt*insertStmt=nil;
NSString*name=[song valueForProperty:MPMediaItemPropertyTitle];
如果(insertStmt==nil){
NSString*语句=[NSString stringWithFormat:@“插入歌曲(名称)值(?)”;
const char*insertSql=[statement UTF8String];
if(sqlite3\u prepare\u v2(数据库,insertSql,-1,&insertStmt,NULL)!=SQLITE\u确定){
NSLog(@“创建insert语句时出错”);
insertStmt=nil;
返回;
}
}
对于(int i=0;i