0

私はxcodeが初めてで、sqliteを更新するのに問題があります。

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 で、favorito=1 はありません。

4

2 に答える 2

2

アプリケーション バンドル内にあるため、データベースを更新できません。最初にデータベースを Documents ディレクトリにコピーし、代わりにそのファイルを変更する必要があります。

于 2013-06-10T01:12:32.367 に答える
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"] ;
}
于 2013-06-10T04:46:17.290 に答える