2013-06-09 2 views
0

Я новичок в xcode, и у меня возникла проблема с обновлением sqlite.update sqlite в приложении iOS

readBioViewController.h

@interface readBioViewController : UIViewController { 
    NSString *fav; 
} 

readBioViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    fav = @"1"; 
} 

- (IBAction)addFavorito:(id)sender { 
    DataDAO *dbCrud = [[DataDAO alloc] init]; 
    NSLog(@"addFavorito favid '%@'.", fav); 
    [dbCrud addFavorito:fav]; 
} 

DataDAO.m

-(void)addFavorito:(NSString *)fav { 

    NSFileManager *fileMgr = [NSFileManager defaultManager]; 

    NSString *dirPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"versos.sqlite"]; 

    BOOL success = [fileMgr fileExistsAtPath:dirPath]; 

    if(!success) { 
     NSLog(@"Cannot locate database file '%@'.", dirPath); 
    } 

    if(!(sqlite3_open([dirPath UTF8String], &db) == SQLITE_OK)) { 
     NSLog(@"An error has occured."); 
    } 

    NSString *sql = @"update Versos set favorito = 1 Where id = 2"; 

    char *err; 
    if(sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { 
     sqlite3_close(db); 
     NSLog(@"erro no update"); 
    } else 
     NSLog(@"fez o update"); 
} 

У меня есть кнопка (IBOutlet - addFavorito), и я хочу, чтобы выполнить SQL для обновления ID (2). Я вижу в NSLog результат «NSLog (@« fez o update »); но когда я открываю versos.sqlite, результат в ID 2 является favorito = 0 и no favorito = 1.

+0

Почему вы пытаетесь выполнить команду, даже когда открыты не удалось? Почему вы закрываете БД только при возникновении ошибки? У этой записи есть ID '2' или' '2''? –

+0

ID 2 (целое число) и «favorito» - CHAR. Эта команда SQL "update Versos set favorito = '1' Где id = 2" в порядке, когда я выполняю в SQLite Manager – eugui

ответ

2

Вы не можете обновить базу данных, потому что она находится внутри вашего приложения. Сначала необходимо скопировать базу данных в папку «Документы» и изменить этот файл.

0

Используйте эту функцию для создания базы данных в каталоге документов.

-(void)CopyDatabaseIfNeeded 
{ 

NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *dbpath=[paths objectAtIndex:0]; 

dbpath=[dbpath stringByAppendingPathComponent:@"versos.sqlite"]; 

BOOL success; 

NSFileManager *filemanager=[NSFileManager defaultManager]; 

success=[filemanager fileExistsAtPath:dbpath]; 

if(success) return; 

NSString *dbpathfromapp=[[[NSBundle mainBundle] resourcePath ] stringByAppendingPathComponent:@"versos.sqlite"]; 
success=[filemanager copyItemAtPath:dbpathfromapp toPath:dbpath error:nil]; 
if(!success) 
{ 
    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Error " message:@"failed to Create writable dataBase" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

} 

, а затем для обновления базы данных, используйте следующие функции, чтобы получить путь базы данных/

-(NSString *) GetDatabasePath { 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ; 
NSString *documentsDirectory = [paths objectAtIndex:0] ; 
return [documentsDirectory stringByAppendingPathComponent:@"versos.sqlite"] ; 
}