2012-04-09 3 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». Пробовал выбрать из таблицы моей базы данных с Терминалом и получил ошибку «не удалось открыть файл базы данных». Где моя ошибка? Я не вижу никаких проблем в моем коде ...

+1

какой-либо причине вы решили не использовать Core Data? – wlangstroth

+0

Или, по крайней мере, FMDB? – Eugene

+0

Я был бы рад использовать Core Data, но мой уровень программирования должен быть низким, но для его использования :) – 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 командной строки, я предлагаю вам проверить, что файл существует, читается и в правильном формате.

Попробуйте воспроизвести ошибку в вашем симуляторе (в противном случае скопируйте файл базы данных на свой компьютер, например, с помощью Organizer). Попробуйте выполнить запрос с помощью 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

написать код для проверки наличия или отсутствия таблицы. и до того, как вы выполните запрос, выберите u, чтобы проверить, что создать таблицу, если она не существует.

NSLog (@ "Connection OK");

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

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

Если это работает, пожалуйста, как это

1

хорошо я предполагаю, ур базы данных не в состоянии подключиться. Попробуйте мой ответ от Here ...

Я упомянул кое-что здесь, и я считаю, что у буду просто Fine

Позвольте мне знать, что работал

+0

Пробовал свой путь. У него не было ошибок. – RomanHouse

+0

Также я попытался запустить мои старые версии проекта, они имеют ту же ошибку, но раньше работали. Может быть, это ошибка xCode или Simulator? – RomanHouse