Загрузить базу данных sqlite с URL

#objective-c

#objective-c

Вопрос:

Я использую этот код для загрузки локальной базы данных sqlite.

 - (id)init
{
    self = [super init];
    if (self) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite3"];
        _db = [[MDDatabase alloc] initWithPath:path];
        _HTMLRenderer = [[MDHTMLRenderer alloc] init];
    }
    return self;
}
  

Я хотел бы подключить базу данных к Сети и позволить приложению загружать базу данных вместо этого. Я изменил код на:

 NSData *dbFile = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.someurl.com/DatabaseName.sqlite"]];

        NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

        NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];

        [dbFile writeToFile:filePath atomically:YES];
        _db = [[MDDatabase alloc] initWithPath:filePath];
        _HTMLRenderer = [[MDHTMLRenderer alloc] init];
  

Отредактировано:
Я изменил свой код, чтобы следовать, но он разбился.

 - (id)init
{
    self = [super init];
    if (self) {
        [self performSelectorOnMainThread:@selector(downalod) withObject:nil waitUntilDone:YES];
        NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

        NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];
        _db = [[MDDatabase alloc] initWithPath:filePath];
        _HTMLRenderer = [[MDHTMLRenderer alloc] init];
    }
    return self;
}

-(void)download
{

    NSData *dbFile = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.someurl.com/DatabaseName.sqlite"]];

    NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

    NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];

    [dbFile writeToFile:filePath atomically:YES];
}
  

Комментарии:

1. Существует бесчисленное множество примеров правильного получения ссылки на папку Documents. Пожалуйста, выполните поиск по NSDocumentDirectory .

Ответ №1:

  1. У вас проблема в вашем файле. Проверьте правильность URL. Это проблема с кодировкой. Попробуйте это (это сработает): http://spaceflight.nasa.gov/gallery/images/apollo/apollo17/hires/s72-55482.jpg
  2. Добавьте настройки безопасности транспорта приложений (разрешать произвольные загрузки — ДА) в свой список.
  3. Включить фоновый режим.
  4. Объявите этот макрос в .m

     #define DocumentsDirectory [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
      

Теперь вызовите, и у вас будет файл в вашем локальном.

Вызовите, как:

 [self performSelectorOnMainThread:@selector(downalod) withObject:nil waitUntilDone:NO];

  _db = [[MDDatabase alloc] initWithPath:filePath];
    _HTMLRenderer = [[MDHTMLRenderer alloc] init];

 -(void)download
 {

    NSString *stringURL =[NSString stringWithFormat: @"url"];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",[stringURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSString *filePath = [DocumentsDirectory stringByAppendingPathComponent:[url lastPathComponent]];
NSLog(@"success--222,%@", filePath);

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{

    NSLog(@"success--222,%@", filePath);


    if (error)
    {
        NSLog(@"success--not---Error,%@", [error localizedDescription]);
    }
    else
    {
        NSLog(@"success--yes... %@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);

        [data writeToFile:filePath atomically:YES];

    }
}];
 }
  

Комментарии:

1. Куда я должен поместить self performSelectorOnMainThread код? Находится ли это под - (id)init ?

2. ДА. дайте мне знать.

3. Я не знаю, кто проголосовал против этого. Объясните причину вашего отказа в голосовании. @кто-нибудь.

4. Произошел сбой приложения. Можете ли вы помочь проверить, верен ли код?

5. Дайте мне свой URL. позвольте мне попробовать.

Ответ №2:

После долгих поисков, наконец, я решил это сам:

 - (id)init
{
    self = [super init];
    if (self) {
        NSData *fetchedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.someurl.com/db.sqlite3"]];
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filePath = [documentsPath stringByAppendingPathComponent:@"db.sqlite3"];
        [fetchedData writeToFile:filePath atomically:YES];
        _db = [[MDDatabase alloc] initWithPath:filePath];
        _HTMLRenderer = [[MDHTMLRenderer alloc] init];
    }
    return self;
}