当我试图关闭 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 点,我会进入无限循环。
我几乎可以肯定问题出在这个函数上,我也在用数据库做其他事情,所以错误可能在代码的其他部分,但代码很多。所以如果问题不在这里,请写它在评论中,我将发布代码的其他“可疑”部分。