2015-04-18 2 views
0

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

NSString * paths=[self getWritableDBPath]; 
const char *dbpath = [paths UTF8String]; 
sqlite3_stmt *statement; 
static sqlite3 *database = nil; 
if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
{ 
    NSString *querySQL = [NSString stringWithFormat: @"SELECT questionright, totalquestions, FROM results", nil]; 

    const char *query_stmt = [querySQL UTF8String]; 


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

     while(sqlite3_step(statement) == SQLITE_ROW) 
     { 
      //code... 
     } 

     sqlite3_finalize(statement); 
    } 


    sqlite3_close(database); 
} 

Вот getWritableDBPath:

-(NSString *) getWritableDBPath { 
NSString *myDB = @"appData.db"; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:myDB]; 

} 

Причина, по которой не работает, что sqlite3_prepare_v2 если заявление никогда не удовлетворяется.

Когда я пишу в базу данных, я копирую его в документы.

Я уверен, что таблица результатов существует, поскольку я могу написать ей. Вот оригинальное заявление SQL:

DROP TABLE IF EXISTS "Questions"; 
CREATE TABLE "Questions" ("QuestionID" INTEGER PRIMARY KEY NOT NULL , "Question" TEXT, "RightAnswer" TEXT, "WrongAnswer1" TEXT, "WrongAnswer2" TEXT, "Done" BOOL, "Catagory" TEXT, "Audio" INTEGER); 
DROP TABLE IF EXISTS "Results"; 
CREATE TABLE "Results" ("ResultID" INTEGER PRIMARY KEY NOT NULL , "QuestionRight" INTEGER, "TotalQuestions" INTEGER, "Catagory" TEXT); 

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

Благодарим за помощь.

+0

Какое значение возвращает функция 'sqlite_prepare_v2'? Сравните это со списком кодов ошибок, найденных здесь (http://www.sqlite.org/rescode.html) и отправьте ответ. Кроме того, не используйте '[NSString stringWithFormat:]', если у вас нет формата. Просто используйте 'const char * query_stmt =" SELECT questionright, totalquestions, FROM results ";' –

+0

sqlite_prepare_v2 возвращает значение 1. Спасибо за советы по использованию const char. –

+0

1 является 'SQLITE_ERROR', который, я боюсь, является действительно общим кодом ошибки: *** Код результата SQLITE_ERROR является общим кодом ошибки, который используется, когда нет другого более конкретного кода ошибки. *** –

ответ

0

Если вы хотите мой совет, не использовать SQLite гр библиотеки напрямую, если вы на самом деле не нужно, вы можете использовать библиотеку FMDB и избавиться от всех гр головной боли https://github.com/ccgus/fmdb

Вы можете просто сделайте это так:

FMDatabase *db = [FMDatabase databaseWithPath:@"your full db path in documents goes here"]; 
if (![db open]) { 
    return; 
} 
FMResultSet *s = [db executeQuery:@"Your query goes here"]; 
if ([s next]) { 
    int totalCount = [s intForColumn:@"totalCount"]; 
} 
Смежные вопросы