2013-08-22 2 views
2

Я хочу создать простое приложение для iOS. Это приложение загружает простую базу данных SQlite из URL. Но когда база данных загружается и хранится в папке «Документы», я не могу ее открыть некоторым менеджером SQLite, потому что она говорит, что она зашифрована, несмотря на то, что исходная база данных не является.База данных SQlite в приложении iOS зашифрована после загрузки

Также код для чтения этой базы данных не работает, и я думаю, это потому, что база данных зашифрована в папке «Документы». Вот что я получил до сих пор.

-(void) downloadDatabase { 


    NSString *stringURL = @"https://www.dropbox.com/s/cq8y6x29e6ku65r/database.sqlite"; 
    NSURL *url = [NSURL URLWithString:stringURL]; 
    NSData *urlData = [NSData dataWithContentsOfURL:url]; 

    if (urlData != nil) 
    { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"database.sqlite"]; 
     [urlData writeToFile:filePath atomically:YES]; 
     NSLog(@"Stahujem databazu do: %@", filePath); 
    } 
} 

Вот как я загружаю базу данных в приложение.

// Get the documents directory 
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docsDir = dirPaths[0]; 

    // Build the path to the database file 
    NSString *databasePath = [[NSString alloc] 
        initWithString: [docsDir stringByAppendingPathComponent: 
            @"database.sqlite"]]; 

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

    if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK) 
    { 
     NSString *querySQL = @"SELECT * FROM CHAMPIONS"; 

     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      [list removeAllObjects]; 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 

       NSString *text = [[NSString alloc] 
            initWithUTF8String: 
            (const char *) sqlite3_column_text(
                    statement, 1)]; 

       [list addObject:text]; 
       statusOfGettingDataFromDB = @"Found!"; 
       NSLog(@"count: %d", [list count]); 
      } 
      sqlite3_finalize(statement); 
     } 
     sqlite3_close(myDatabase); 
    } 

И с помощью этого кода я пытаюсь получить некоторые данные из базы данных. Но после sqlite3_prepare_v2 он прыгает прямо в конец.

Можете ли вы, пожалуйста, сообщить мне, что я сделал неправильно? И посоветуйте мне, как это исправить? Я буду очень благодарен. Спасибо.

ответ

1

URL-адрес, который вы загружаете, в настоящее время возвращает HTML-страницу, а не файл SQLite.

Следовательно, файл .sqlite, который вы пишете в каталоге документов, недействителен. Ваш код работает правильно, если вы измените URL-адрес

Попробуйте вместо этого URL-адрес, это фактический URL-адрес, который нажал кнопку «Загрузить» на странице «Dropbox».

https://dl.dropboxusercontent.com/s/cq8y6x29e6ku65r/database.sqlite?token_hash=AAH9fdYQzZ6zj8CzhKVBGMi4LcaCRCHNKIlw88wLLskRWQ&dl=1 

Я попробовал ваш код и напечатал list массив извлекается из БД SQLite, и этот результат я получаю в журнале,

(
Ahri, 
Aatrox 
) 

Надежда, что помогает!

+2

Awesome. Большое спасибо. Мне нужно получить FTP :-) – Martin

Смежные вопросы