SQLiteデータベースを閉じようとしたときにコードエラー5が発生していることがわかりました。
そのため、使用したすべてのリソースをリセットするのに苦労しました。
これは、すべてのリソースを適切にリセットしない方法だと思います。
- (NSArray*) allObjects
{
NSMutableArray* objects=[NSMutableArray new];
// resource is an ivar of type sqlite3_stmt* , it has been initialized with
// sqlite3_prepare, a query where I select some rows of a table
if(!resource)
{
return nil;
}
while(sqlite3_step(resource)== SQLITE_ROW)
{
NSMutableDictionary* object=[NSMutableDictionary new];
int count= sqlite3_column_count(resource);
for(int i=0; i<count; i++)
{
// I need to know the type and the name of all columns to build
// a dictionary object.Later I'll optimize it doing this only at
// the first loop iteration.
const char* key=sqlite3_column_name(resource, i);
int type= sqlite3_column_type(resource, i);
const unsigned char* text;
double value;
switch (type)
{
case SQLITE_TEXT:
text=sqlite3_column_text(resource, i);
[object setObject: [NSString stringWithFormat: @"%s",text] forKey: [NSString stringWithFormat: @"%s",key]];
break;
case SQLITE_INTEGER:
value= sqlite3_column_int(resource, i);
[object setObject: @(value) forKey: [NSString stringWithFormat: @"%s",key]];
break;
case SQLITE_FLOAT:
value= sqlite3_column_double(resource, i);
[object setObject: @(value) forKey: [NSString stringWithFormat: @"%s",key]];
break;
case SQLITE_NULL:
[object setObject: [NSNull null] forKey: [NSString stringWithFormat: @"%s",key]];
break;
default:
break;
}
}
// sqlite3_reset(resource); Point 1
[objects addObject: object];
}
// sqlite3_reset(resource); Point 2
return objects;
}
したがって、データベースを閉じるときにsqlite3_reset(resource)をポイント2に配置すると、エラー5が発生します。ポイント1に配置すると、無限ループになります。
問題はこの関数にあるとほぼ確信しています。データベースで他のことも行っているので、エラーはコードの他の部分にある可能性がありますが、それは多くのコードです。したがって、問題がここにない場合は、コメントにそれを入れて、コードの他の「疑わしい」部分を投稿します。