Приложение не отвечает на sqlite, когда оно установлено на реальном устройстве - PullRequest
0 голосов
/ 10 декабря 2011

Я создал приложение, в котором я использую sqlite для хранения данных. Он хорошо работает в симуляторе, но когда он работает на реальном устройстве, он перестает отвечать на sqlite. Даже код не отвечает на команду sqlite .. Вот мой код ..

    - (void)viewDidLoad {

//Create Database
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir=[paths objectAtIndex:0];

NSString *dirString=[dir stringByAppendingPathComponent:@"ABC.sqlite"];

databasepath=[[NSString alloc]initWithString:dirString];
NSFileManager *fileManager=[NSFileManager defaultManager];

if ([fileManager fileExistsAtPath:databasepath]==NO) 
{
    const char *dbpath=[databasepath UTF8String];
    if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK)
    {
        char *errMsg;
        const char *createSQL="CREATE TABLE IF NOT EXISTS QUESTIONS(ID INTEGER PRIMARY KEY AUTOINCREMENT,QUESTIONSLIST TEXT,ANSWER1 TEXT,ANSWER2 TEXT,ANSWER3 TEXT,ANSWER4 TEXT,CORRECTANSWER TEXT)";

        if (sqlite3_exec(contactDB, createSQL, NULL, NULL, &errMsg) !=SQLITE_OK)
        {
            NSLog(@"Failed to create table");

        }
        sqlite3_close(contactDB);
    }


}



[super viewDidLoad];

}

    -(void)xyz{


NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir=[paths objectAtIndex:0];

NSString *dirString=[dir stringByAppendingPathComponent:@"ABC.sqlite"];

databasepath=[[NSString alloc]initWithString:dirString];

const char *dbpath=[databasepath UTF8String];
sqlite3_stmt *statement;

if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK)
{
    NSString *querySQL=[NSString stringWithFormat:@"select * from questions order by random() LIMIT 1"];
    const char *query=[querySQL UTF8String];

    if (sqlite3_prepare_v2(contactDB, query, -1, &statement, NULL)==SQLITE_OK)
    {
        if (sqlite3_step(statement)==SQLITE_ROW)
        {
            NSString *questionField=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 1)];
            questionView.text=questionField;

            NSString *option1=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)];
            [answer1 setTitle:option1 forState:UIControlStateNormal];

            NSString *option2=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)];
            [answer2 setTitle:option2 forState:UIControlStateNormal];


            NSString *option3=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)];
            [answer3 setTitle:option3 forState:UIControlStateNormal];


            NSString *option4=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 5)];
            [answer4 setTitle:option4 forState:UIControlStateNormal];

            NSString *option5=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 6)];
            correctAnswer.text=option5;
            correctAnswer.hidden=NO;


            [option1 release];
            [option2 release];
            [option3 release];
            [option4 release];
            [option5 release];
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(contactDB);

}

}

1 Ответ

0 голосов
/ 13 декабря 2011

NoviceDeveloper:

please tell me how to copy sqlite file to device

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

Следующий шаг - скопировать его в applicationDocumentsDirectory, если вы этого раньше не делали.Что-л.как:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NameOfYourDatabase.sqlite"];
NSError *error = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *defaultStoreURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"NameOfYourDatabase" ofType:@"sqlite"]];
if (![fileManager fileExistsAtPath:[storeURL relativePath]]) {
    if (defaultStoreURL) {
        [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:&error];
    }
}
if (error)
    //handle it

РЕДАКТИРОВАНИЕ:

С функцией:

- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...