2009-04-05 13 views
0

データベースに問題があります。何らかの理由で、データベースが開かれる前に閉じられているように見えます。オブジェクトがデータベースで初期化されたかどうかを知る正しい方法は何ですか?

データベースが開かれていない場合は、次の文を使用しています。if(!database)then break;

*データベースが開かれていないときにデータベースがnil(database = nil)に設定されている場合。

正しい方法でやっていますか?または、私のコードにいくつかの他のエラーがありますか?

は、ここに私のコードです:

-(BOOL) loadDB: (NSString*) dbPath { 

//Database was opened before 
if (database) { 
    sqlite3_close(database); 
    database = nil; 
} 

//Opening database 
if (sqlite3_open([dbPath UTF8String], &database) != SQLITE_OK) 
{ 
    database = nil; 
    return FALSE; 
} 

return TRUE; 

}

コードが複数回呼び出されていると、いくつかの時点でそれが例外をスローします。なぜこれが起こるのでしょうか?

デバッガを使用して問題の発生場所を確認すると、次のように表示されます。sqlite3_close(database);

ありがとうございます。

+0

は、このオブジェクトの最初のインスタンス生成でデータベースをnilに設定していますか?コードスニペットを使用しているので、データベースにアクセスできる他の場所の数を確認するのは難しいです。 – KevinDTimm

答えて

1

代わりにゼロのNULLにデータベースポインタを設定してみてください。

-(BOOL) loadDB: (NSString*) dbPath { 
    BOOL retVal = TRUE 

    //Database was opened before 
    if (database) { 
     sqlite3_close(database); 
     database = NULL; // <-- NULL not nil 
    } 

    //Opening database 
    if (sqlite3_open([dbPath UTF8String], &database) != SQLITE_OK) { 
     database = NULL; // <-- NULL not nil 
     retVal = FALSE; 
    } 
    return retVal; 
} 

オブジェクティブCのゼロではゼロポインタでありますしかし、databaseはオブジェクトへのポインタです。構造体なので、代わりにNULLを使用してください。

+0

あまりにも彼は答えを知らない(またはそれを解決しており、決議を掲載していません)。 – KevinDTimm

+0

彼は重複して私の答えを受け入れたhttp://stackoverflow.com/questions/720603/sqlite3close-throws-an-exception/720739#720739 – Abizern

1

あなたの近くにブレースは時期尚早である(しかし、私はそれがコンパイルしないのでそれが問題だとは思わない。

スタイルの注意点としては、唯一の関数からONE時間を返す(とのことを行ってくださいボトム)。、BOOLを作成TRUEに初期化し、必要な場合、それはFALSEに、値の変化する。

+0

複数の返品は特定の条件に便利ですので、私は原則としてそれを個人的には受け付けません。 – Abizern

+0

複数の返品は、あなたの機能が大きすぎることを意味します。複数の返品を見つけることは、ただのにおいではなく、メンテナンスの悪夢です。 – KevinDTimm

+0

私はあなたの推薦に従ってコードを再設計しましたが、これは役に立たなかったです。 –

関連する問題