2011-12-16 13 views
1

シミュレータと実際のiOSハードウェアはまったく同じではないことがわかりましたが、私はこの問題を解決し始めています。私はこのコードを持っています:iOSでのsqlite3のカウント(特にiPhone/iPadで)

sqlite3 *database; 
sqlite3_stmt *statement; 
int themeCount; 

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
{ 
    NSString *updateSQL = [NSString stringWithFormat: @"SELECT COUNT(*) FROM Theme"]; 
    const char *update_stmt = [updateSQL UTF8String]; 

    if(sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL) == SQLITE_OK){ 

     if(sqlite3_step(statement)==SQLITE_ROW) 
     { 
      themeCount = sqlite3_column_int(statement, 0); 
     } 
    } 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
} 

シミュレータでは、それは完璧に動作します。一度デバイスにプッシュすると失敗します。私はそれを分解し、それが失敗し、戻りコードを思い付いてきた:私は、コードをキャプチャするために、その行を変更した場合

if(sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL) == SQLITE_OK) 

(。つまり、int型のx = sqlite3_prepare_v2(...))は、0を返します。シミュレータ、1をデバイスとともに使用します。私はここで何が間違っているのですか?!?!

また、記録のために、テーマテーブル用のCREATE文は次のとおりです。

@"CREATE TABLE Theme (ThemeId INTEGER PRIMARY KEY, ThemeName TEXT, Available BIT);" 

(私の最初の考えは、それは大文字と小文字を区別したということです)

答えて

3

あなたはあなただと思いデータベースを開いていません開かれている。 sqlite3_prepare_v2は、スキーマが存在する必要がある最初のステートメントです。あなたのdatabasePathが間違っていると思われます。

sqlite3_open_v2と具体的には、sqlite3_openのデフォルトであるSQLITE_OPEN_CREATEフラグを省略することで、新しいデータベースがオープンコールによって作成されていることに気付かない場合があります。 SQLite3 docsを参照してください。

sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) 

の結果では、データベースが存在しないことがわかります。

+0

データベースは存在しますが、これは私が開くことを期待しているデータベースです。アプリケーションの実行開始時にブレークポイントをドロップすると(データベースへの更新など)、データベースは特定の場所(/ var/mobile/Applications/{GUID}/Documents/dbname})問題のメソッド(上記)は、同じパスを持ち、あなたの答え(あなたの答え)のように見えるようにコードを変更したときに、 "通過"する(つまりSQLITE_OK)。それはまだ内部に入り、prepare_v2を実行し、任意の行(つまり同じ結果)をスキップします。これは本当にイライラです! – SlackerCoder

+0

OK、あなたは間違いなく(少なくとも部分的に)正しいです。明らかに、シミュレータでは、databasename.sqliteとDatabaseName.sqliteの間に違いはありませんが、iPhoneでは非常に異なっています。したがって、同じ名前でしたが、ACTUALファイルが見つかりませんでした。 100万人私に正しい方向を向けると、これを解決する手助けをしてくれてありがとう! – SlackerCoder

関連する問題