#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:
- У вас проблема в вашем файле. Проверьте правильность URL. Это проблема с кодировкой. Попробуйте это (это сработает): http://spaceflight.nasa.gov/gallery/images/apollo/apollo17/hires/s72-55482.jpg
- Добавьте настройки безопасности транспорта приложений (разрешать произвольные загрузки — ДА) в свой список.
- Включить фоновый режим.
-
Объявите этот макрос в .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;
}