将数据插入sqlite数据库

时间:2014-06-30 19:28:30

标签: ios objective-c database sqlite

我将数据插入到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);
    }
}

1 个答案:

答案 0 :(得分:1)

您正在捆绑中打开数据库。捆绑包在设备上是只读的。您必须将数据库复制到Documents文件夹(如果它已经不存在)并从那里打开它。

另请注意,您正在处理数据库的多个副本(项目中的一个副本,捆绑中的一个副本以及现在设备/模拟器中Documents文件夹中的一个副本)。确保您在正确的数据库中检查插入的记录(Documents中的那个)

另外,您还应该检查sqlite3_prepare_v2是否返回SQLITE_OK,如果没有,请记录sqlite3_errmsg

您还应该在SQL中使用?占位符并使用sqlite3_bind_text绑定值(或者,如果它可能是nilsqlite_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方法中的逻辑,但希望这说明了这个想法。