IOS: открыть sqlite из URL-адреса

Я хочу открыть sqlite db, но его нет в моем mainBundle, а на сервере, тогда у меня его нет

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];

но у меня есть

NSString *filePath = @"http://serverAddress/info.sqlite";
NSURL *url = [NSURL URLWithString:filePath];
NSData *myData = [NSData dataWithContentsOfURL:url];

и когда я читаю эту базу данных, что я могу сделать? Если моя БД находится внутри mainBundle, я делаю это:

if (sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {

        const char *sql = "select id, one, two from TABLE";
        sqlite3_stmt *selectstmt;

        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {

                idNum = [NSNumber numberWithInt:(int)sqlite3_column_int(selectstmt, 0)];
                ...
                ...

а если у меня NSData? Можешь мне помочь?


person cyclingIsBetter    schedule 25.02.2013    source источник


Ответы (2)


SQLite является «безсерверным», вы не можете получить доступ со своего устройства к файлу SQLite, размещенному на сервере. Если это база данных только для чтения, вы можете сначала загрузить ее или использовать другой сервер базы данных (и клиент).

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

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* filePath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];

[data writeToFile:filePath atomically:NO];

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

person redent84    schedule 25.02.2013
comment
аааа хорошо ... Я использую менеджер SQLite для Mozilla Firefox, где я могу установить его как базу данных только для чтения? - person cyclingIsBetter; 25.02.2013
comment
Только для чтения я имею в виду, что вы не хотите, чтобы изменения отражались на сервере. Если это так, вам не нужно ничего менять. Просто помните, что изменения, сделанные в приложении, не изменят базу данных сервера. - person redent84; 25.02.2013
comment
ах, хорошо... это точно... Я хочу только читать и никогда не писать в этой базе данных... но я использую этот код, и он возвращает нулевое значение NSString *filePath = @http:///address/info.sqlite; NSURL *url = [NSURL URLWithString:filePath]; NSData *myData = [NSData dataWithContentsOfURL:url]; если (!myData) NSLog(@MY DATA IS NULL); NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[@Documents/stringByAppendingString:@info.sqlite]]; [myData writeToFile:путь атомарно:YES]; - person cyclingIsBetter; 25.02.2013
comment
Убедитесь, что файл доступен из Интернета (проверьте URL-адрес в веб-навигаторе). - person redent84; 25.02.2013

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

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

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];

помните, прежде чем загружать файл «info.sqlite», вам нужно сохранить его в файл из NSData. Я не пробовал, но должно сработать :)

Удачного кодирования!!!

person Prasad De Zoysa    schedule 25.02.2013
comment
Вы не можете сохранить файл внутри пакета приложений. - person redent84; 25.02.2013
comment
Меня отослали к каталогу документов, можно записать файл в каталог документов приложения. - person Prasad De Zoysa; 25.02.2013