0

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

4

1 回答 1

2

您应该将“重置”放在第 2 点。sqlite3_finalize然后,当您不再需要准备好的语句时,您应该调用它。执行此操作后,您还应该将 ivar 设置为nil

sqlite3_reset表示您已准备好再次使用该语句。sqlite3_finalize表示您已完全完成该语句,并且应该清理其资源。

错误 5 是SQLITE_BUSY。如果“最终确定”不能解决问题,请搜索SQLITE_BUSY.

于 2012-12-16T01:20:41.433 回答