我将数据插入到sqlite数据库中,我在控制台结果上看到了NSLog(@“DONE”),但我没有看到我的sqlite数据库文件中的数据更新。请帮助我!!!
这是我保存数据的代码:
- (void)saveData:(NSString *)_Id
{
sqlite3_stmt *statement;
NSString *_databasePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"data.db"];
const char *dbpath = [_databasePath UTF8String];
if (sqlite3_open(dbpath, &db) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat:
@"INSERT INTO MyTable (id) VALUES (\"%@\")", _Id];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(db, insert_stmt,
-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(@"DONE");
} else {
NSLog(@"Failed to add contact");
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
}
答案 0 :(得分:1)
您正在捆绑中打开数据库。捆绑包在设备上是只读的。您必须将数据库复制到Documents
文件夹(如果它已经不存在)并从那里打开它。
另请注意,您正在处理数据库的多个副本(项目中的一个副本,捆绑中的一个副本以及现在设备/模拟器中Documents
文件夹中的一个副本)。确保您在正确的数据库中检查插入的记录(Documents
中的那个)
另外,您还应该检查sqlite3_prepare_v2
是否返回SQLITE_OK
,如果没有,请记录sqlite3_errmsg
。
您还应该在SQL中使用?
占位符并使用sqlite3_bind_text
绑定值(或者,如果它可能是nil
,sqlite_bind_null
):
- (void)saveData:(NSString *)_Id
{
sqlite3_stmt *statement;
NSString *bundlePath = [[[NSBundle mainBundle] resourcePath ] stringByAppendingPathComponent:@"data.db"];
NSString *documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *documentsPath = [documentsFolder stringByAppendingPathComponent:@"data.db"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:documentsPath isDirectory:NO]) {
NSError *error;
if (![fileManager copyItemAtPath:bundlePath toPath:documentsPath error:&error]) {
NSLog(@"database copy failed: %@", error);
}
}
const char *dbpath = [documentsPath UTF8String];
if (sqlite3_open(dbpath, &db) == SQLITE_OK) {
const char *insertSql = "INSERT INTO MyTable (id) VALUES (?)";
if (sqlite3_prepare_v2(db, insertSql, -1, &statement, NULL) != SQLITE_OK) {
NSLog(@"prepare error: %s", sqlite3_errmsg(db));
}
// bind a value to the ? placeholder in the SQL
if (_Id) {
if (sqlite3_bind_text(statement, 1, [_Id UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) {
NSLog(@"bind text error: %s", sqlite3_errmsg(db));
}
} else {
if (sqlite3_bind_null(statement, 1) != SQLITE_OK) {
NSLog(@"bind null error: %s", sqlite3_errmsg(db));
}
}
if (sqlite3_step(statement) == SQLITE_DONE) {
NSLog(@"DONE");
} else {
NSLog(@"Failed to add contact: %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
}
如果数据库不存在于文档中,那么大多数人都会移动#34;然后从包中复制它并从那里打开它"专用openDatabase
方法中的逻辑,但希望这说明了这个想法。