【问题标题】:UPDATE sql query when button pressed?按下按钮时更新sql查询?
【发布时间】:2014-01-18 03:03:41
【问题描述】:

所以我想要做的是在我按下按钮时对我的 sqlite 数据库运行 UPDATE 查询。下面是我所拥有的但它不起作用,我认为问题是我正在从包中打开数据库,这当然是只读的。现在我一直在做一些研究,我意识到我应该:

  1. 检查 Documents 文件夹中是否存在数据库。

  2. 如果不存在,请将数据库从捆绑包复制到 Documents 文件夹。

  3. 现在,从 Documents 文件夹打开数据库。

但我不知道该怎么做???任何帮助将不胜感激。这是我所拥有的:

- (IBAction)update:(id)sender {
@try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath  ]stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
    {
        NSLog(@"An error has occured: %s", sqlite3_errmsg(db));

    }
    const char *sql = "UPDATE strengthexercises SET isFavorite = 'true' WHERE ID = '1'";
    sqlite3_stmt *sqlStatement;
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
    }else{
        if (sqlite3_step(sqlStatement) == SQLITE_DONE){
            NSLog(@"Success");
        }
    }
    sqlite3_finalize(sqlStatement);
}
@catch (NSException *exception) {
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}
@finally {
    sqlite3_close(db);
}

}

用一个例子给出一个明确的答案会很有帮助。提前致谢。

更新 #1

现在我有了这个,但它仍然不起作用......

- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}

 - (IBAction)update:(id)sender {
@try {
    NSString *docsPath = [self applicationDocumentsDirectory];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dbPath];
    if (!fileExists) {
        // get the source path to copy from
        NSString *dbSourcePath = [[[NSBundle mainBundle] resourcePath  ]stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"];
        // copy db to documents
        [[NSFileManager defaultManager] copyItemAtPath:dbSourcePath toPath:dbPath error:nil];
    }
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
    {
        NSLog(@"An error has occured: %s", sqlite3_errmsg(db));
    }
    const char *sql = "UPDATE strengthexercises SET isFavorite = 'true' WHERE ID = '1'";
    sqlite3_stmt *sqlStatement;
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
    }else{
        if (sqlite3_step(sqlStatement) == SQLITE_DONE){
            NSLog(@"Success");
        }
    }
    sqlite3_finalize(sqlStatement);
}
@catch (NSException *exception) {
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}
@finally {
    sqlite3_close(db);
}

}

【问题讨论】:

    标签: ios sql objective-c sqlite


    【解决方案1】:

    写一个方法来返回这样的文档路径 -

    - (NSString *)applicationDocumentsDirectory {   
         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
         NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
         return basePath;
    }
    

    然后检查文档路径中是否存在 db -

    NSString *docsPath = [self applicationDocumentsDirectory];
    NSString *dbDocsPath = [docsPath stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dbDocsPath];
    

    使用条件来确定 db 是否需要复制,如果需要,则复制 -

    if (!fileExists) {
         // get the source path to copy from
         NSString *dbSourcePath = [[NSBundle mainBundle] pathForResource:@"StayhealthyExercises-1" ofType:@"sqlite"];
         // copy db to documents
         [[NSFileManager defaultManager] copyItemAtPath:dbSourcePath toPath:dbDocsPath error:nil];
    }
    

    您现在应该在可以读取/写入的文档中拥有您的数据库副本。

    【讨论】:

    • 我已经用我所拥有的更新了我的问题,但它仍然不起作用,有什么线索吗?
    • 我缩小了问题的范围,使用该代码甚至无法阅读它...任何建议
    • 它说 dbSourcePath 是一个未声明的标识符,我猜是因为它在 if 语句中
    • 您是否可以通过导航到模拟器的文档目录或使用管理器探索设备来确认数据库的复制
    • 好的,我可以建议做一些穴居人伐木。从记录 dbSourcePath 开始。我很好奇是否应该使用 pathForResource:ofType: 代替 NSBundle 的 resourcePath 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2020-06-06
    • 2020-05-17
    相关资源
    最近更新 更多