2012-04-09 22 views
2

sqlite3データベースからの読み込みにいくつか問題があります。sqlite3データベースから選択できません

-(void) readMessengesFromDatabase { 
    sqlite3 *database; 

    messenges = [[NSMutableArray alloc] init]; 

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     NSLog(@"Connection OK"); 
     const char *sqlStatement = "select * from MessagesData"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE"); 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { //не проходит условие 
      NSLog(@"Connection to table OK"); 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       NSLog(@"Read rows OK"); 
       NSString *dbMessageID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
       NSString *dbMessageText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
       NSString *dbMessageDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
       NSString *dbMediaOrNot = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 

       Message *messege = [[Message alloc] initWithName:dbMessageText messageID:dbMessageID messageDate:dbMessageDate mediaOrNot:dbMediaOrNot]; 

       [messenges addObject:messege]; 

       [messege release]; 
      } 
     } 
     sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database);  
} 

私の最初のNSLogは、データベースへの接続が正常であることを私に示しています。しかし次のステップ "select * from MessagesData"とif(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE");は私に "connect to table FALSE"と表示しています。私のデータベースのテーブルwhithターミナルから選択し、エラー"データベースファイルを開くことができません"を得ました。私のミスはどこですか?私のコードには何の問題もありません。

+1

あなたは、コアデータを使用しないことを選択した任意の理由を働い教えてください? – wlangstroth

+0

または少なくともFMDBですか? – Eugene

+0

私はコアデータを使用して幸せですが、私のプログラミングレベルはまだそれを使用するために低いです:) – RomanHouse

答えて

2

sqlite3_prepare_v2が返すエラーコードを印刷すると、問題を診断するのがずっと簡単になります。数値はthis pageにあります。

int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL); 
if(errorCode != SQLITE_OK) { 
    NSLog(@"Connect to table failed: %d", errorCode); 
} 

あなたもsqlite3コマンドラインツールでデータベースから選択することができない場合は、私はあなたがファイルが存在することを確認してください示唆、読みやすく、正しい形式です。

シミュレータでエラーを再現してください(失敗した場合、オーガナイザを使用してデータベースファイルをコンピュータにコピーしてください)。 sqlite3を使用してクエリを実行してみてください(私はそれを試したことは知っていますが、以下を確認してください)。

メッセージError: file is encrypted or is not a databaseが表示されている場合は、データベースファイルが壊れていることを意味します。 Error: no such table:を取得した場合、データベースが存在しないこと、が空であること、またはが空であるか、単にテーブルが取得されていないことを意味します。もしあなたが(あなたの質問と同じように)Error: unable to open database(これはsqliteを開いているときではなく、クエリを実行している間に取得されます)、sqliteがファイル(たとえば権限)を読み込めないことを意味します。

+0

エラーコードは "1"です。それは何でしょうか?データベースがありませんか?以前のプロジェクトバージョンを実行しようとしましたが、同じエラーが発生しました(ただし、以前はうまくいきました!)。 – RomanHouse

+0

このパスにファイルが存在しますか? '[[NSFileManager defaultManager] fileExistsAtPath:databasePath]'は – Krumelur

+0

と表示されます。ファイルが存在します。 – RomanHouse

0

テーブルが存在するかどうかを確認するコードを作成します。クエリの実行を実行する前に、テーブルが存在しない場合は、テーブルを作成する必要があります。

NSLog(@ "Connection OK");それが動作している場合、それは

1

も私はウルデータベースが接続できていない推測したいとしてください

sqlite3_exec(database,"CREATE TABLE IF NOT EXISTS MessagesData (ID INTEGER PRIMARY KEY AUTOINCREMENT ," 
          "FirstName TEXT,LastName TEXT")); 

    const char *sqlStatement = "select * from MessagesData"; 

が、私はここにいくつかのことを述べた... Hereからの私の回答を試してみて、私はuがうまくできるでしょうと信じて

私はそれが

+0

あなたの方法を試してみてください。それはエラーを示さなかった。 – RomanHouse

+0

また、以前のプロジェクトバージョンを実行しようとしましたが、同じエラーが発生していましたが、以前は機能していました。たぶんxCodeやSimulatorのバグでしょうか? – RomanHouse

関連する問題