Ios 无法使用objective c将行插入sqlite数据库

Ios 无法使用objective c将行插入sqlite数据库,ios,objective-c,database,sqlite,Ios,Objective C,Database,Sqlite,出于某种原因,下面的代码没有在我的sqlite数据库中存储任何数据。返回代码是SQLITE_DONE 101,因此它不会给我任何错误消息。该方法被多次调用以填充数据库中的几行。有人能看出我哪里做错了吗 - (void)storePersonInDatabase:(Person *)person { const char *sql = "INSERT INTO PERSON (ID, NAME, NOTES, ADDRESS, PROMOTED, VEGETARIAN) values (?

出于某种原因,下面的代码没有在我的sqlite数据库中存储任何数据。返回代码是SQLITE_DONE 101,因此它不会给我任何错误消息。该方法被多次调用以填充数据库中的几行。有人能看出我哪里做错了吗

- (void)storePersonInDatabase:(Person *)person {
    const char *sql = "INSERT INTO PERSON (ID, NAME, NOTES, ADDRESS, PROMOTED, VEGETARIAN) values (?, ?, ?, ?, ?, ?)";
    sqlite3_stmt *statement;

    // Prepare the data to bind.
    NSData *imageData = person.imageData;
    NSString *personId = [person.personId stringValue];
    NSString *personName = person.name;
    NSString *address = person.address;
    NSString *notes = person.notes;
    NSString *isVegetarian = (person.isVegetarian) ? @"1" : @"0";
    NSString *isPromoted = (person.isPromoted) ? @"1" : @"0";

    // Prepare the statement.
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
        // Bind the parameters (note that these use a 1-based index, not 0).
        sqlite3_bind_text(statement, 1, [personId UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 2, [personName UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 3, [notes UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 4, [address UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 5, [isPromoted UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 6, [isVegetarian UTF8String], -1, SQLITE_TRANSIENT);

    }

    // Execute the statement.
    int returnCode = sqlite3_step(statement);
    if (returnCode != SQLITE_DONE) {
        // error handling...
        NSLog(@"An error occoured");
    }
//我就是这样设置数据库的

NSString *sqliteDb = [[NSBundle mainBundle] pathForResource:@"Persons" ofType:@"sqlite"];
if(sqlite3_open([sqliteDb UTF8String], &database) != SQLITE_OK){
    NSLog(@"Unable to open database");
}

您将演示如何尝试在应用程序包中打开sqlite文件

您无法写入应用程序包

应用程序包是只读的

你需要把它复制到你可以写信的地方。听起来应该去图书馆/文档

伪代码是:

if(!sqlite_already_in_library) {
    [file_manager copyFileFrom:sqlite-in-bundle to:sqlite-in-library_path];
}

您将演示如何尝试在应用程序包中打开sqlite文件

您无法写入应用程序包

应用程序包是只读的

你需要把它复制到你可以写信的地方。听起来应该去图书馆/文档

伪代码是:

if(!sqlite_already_in_library) {
    [file_manager copyFileFrom:sqlite-in-bundle to:sqlite-in-library_path];
}

正如一些人所建议的,您需要将数据库复制到项目包之外的位置。在那里,您可以按照自己的意愿进行读写,否则每次尝试运行“storePersonInDatabase”方法时,您实际上只是在创建新的数据库


在尝试与数据库交互之前,应该执行DaijDjan提供的相同检查。您还应该将数据库的位置或名称保存在某个位置,以便于访问和文件检查。

正如一些人所建议的,您需要将数据库复制到项目包之外的位置。在那里,您可以按照自己的意愿进行读写,否则每次尝试运行“storePersonInDatabase”方法时,您实际上只是在创建新的数据库


在尝试与数据库交互之前,应该执行DaijDjan提供的相同检查。您还应该将数据库的位置或名称保存在某个地方,以便于访问和文件检查。

不要将数据绑定到SQ查询,而是将数据直接传递到Inser查询…SQLite数据文件存储在哪里?我还需要在此行中存储一个图像,因此我试图避免将字符串直接放入查询中。SQLite数据文件存储在项目的根目录中。我可以从中读取没有问题。是否在SELECT查询中获取插入值?不是将数据绑定到SQ查询,而是将数据直接传递到Inser查询…SQLite数据文件存储在哪里?我还需要在此行中存储一个图像,因此我试图避免将字符串直接放入查询中。SQLite数据文件存储在项目的根目录中。我可以读取它没有问题。您是否在SELECT查询中获得插入值?