SQLite в iPhone - PullRequest
       12

SQLite в iPhone

1 голос
/ 08 августа 2011

У меня есть приложение, которое вызывает веб-службы и сохраняет результаты в sqlite db. Идея заключается в том, что, когда устройство находится в автономном режиме, эти постоянные результаты извлекаются.Все это работает нормально, но если я перестрою проект, база данных, похоже, будет стерта, и я не смогу получить какие-либо данные, которые я ранее вставил. Кто-нибудь может объяснить, что здесь происходит, пожалуйста?Я использую симулятор 4.3 и Xcode 4.

Я также использую библиотеку FMDatabase ...

-(NSMutableArray*)retrieveDataSourceOfType:(NSString*)type{
    FMDatabase *db = [self getDB];
    NSMutableArray *items = [[NSMutableArray alloc] initWithObjects:nil];
    if([type isEqualToString:@"AlertItem"]){
        FMResultSet *results = [db executeQuery:@"SELECT * FROM AlertItem"];
        while([results next]){
            AlertItem *tmp = [[AlertItem alloc] init];
            tmp.Description = [results stringForColumn:@"Description"];
            tmp.NumItems = [results intForColumn:@"NumItems"];
            tmp.ModuleGroup = [results stringForColumn:@"ModuleGroup"];
            tmp.StaffID = [results intForColumn:@"StaffID"];
            tmp.Status = [results intForColumn:@"Status"];
            [items addObject:tmp];
        }
    }
    [db close];
    [db release];
    return items;
}



-(FMDatabase*)getDB{

NSString *path = [[[NSBundle mainBundle] resourcePath] 
stringByAppendingString:@"/XXXX.sqlite"];
    NSLog(@"%@", path);
    NSFileManager *fm = [NSFileManager defaultManager];
    if([fm fileExistsAtPath:path]){
        FMDatabase *db = [[FMDatabase databaseWithPath:path]retain];
        NSLog(@"%@", path);
        if(![db open]){
            [db release];
            return nil;
        }
        else{
            return db;
        }
    }

}

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

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

Вот как получить путь:

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
  NSString *cacheDirectory = [paths objectAtIndex:0]; 

Здесь - другие каталоги, которые вы можете использовать.

Я бы попробовал NSFileManager для копирования файлов. Я не уверен в этом, я использую sqlite только для автозаполнения, без вставки / обновления.

Попробуйте fileExistsAtPath, чтобы увидеть, существует ли файл, и если нет, скопируйте пустой из ваших ресурсов, используя copyItemAtPath

0 голосов
/ 08 августа 2011

Если вы тестируете только на симуляторе, возможно, вы иногда делаете «Очистить все цели». Если это не тот случай, чем просьба показать, как вы открываете соединение с базой данных? Возможно, вы откроете временную базу данных, и она будет удалена, как только соединение закроется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...