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];

и когато прочета този db какво мога да направя? Ако моята db е в 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, където мога да го настроя като db само за четене? - 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]; if (!myData) NSLog(@MY DATA IS NULL); NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[@Documents/ stringByAppendingString:@info.sqlite]]; [myData writeToFile:path atomically: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