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です。「finalize」で問題が解決しない場合は、の原因を検索してくださいSQLITE_BUSY

于 2012-12-16T01:20:41.433 に答える