Iphone 无法使用iOS将数据插入sqlite3数据库

Iphone 无法使用iOS将数据插入sqlite3数据库,iphone,ios,objective-c,ipad,sqlite,Iphone,Ios,Objective C,Ipad,Sqlite,我使用MacOS终端创建了一个数据库名数据库。sql并插入了一些记录。使用iOS可以检索插入的值 但是我使用iOScode试图将记录插入数据库,但它没有将记录输入数据库 我应该设置需要设置一些权限吗?这是我的代码: - (void)viewDidLoad { [super viewDidLoad]; [self openDB]; } -(IBAction)save:(id)sender{ [self insertRecordIntoTableNamed:@"Conta

我使用
MacOS
终端创建了一个数据库名数据库。
sql
并插入了一些记录。使用
iOS
可以检索插入的值

但是我使用
iOS
code试图将记录插入数据库,但它没有将记录输入数据库

我应该设置需要设置一些权限吗?这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self openDB];
}

-(IBAction)save:(id)sender{

    [self insertRecordIntoTableNamed:@"Contacts" 
                         field1Value:fname.text
                         field2Value:lname.text
                         field3Value:comp.text 
                         field4Value:email.text 
                         field5Value:pnumber.text 
                         field6Value:mnumber.text 
                         field7Value:add.text 
                         field8Value:city.text 
                         field9Value:state.text];
}


-(void)openDB{
    NSString *sqlfile=[[NSBundle mainBundle]pathForResource:@"database" ofType:@"sql"];

    if(sqlite3_open([sqlfile UTF8String], &db)!= SQLITE_OK){
        sqlite3_close(db);
        NSLog(@"Database connected");
        NSAssert(0,@"Database failed to open");
    }
    else
    {
        NSLog(@"Database connected");
    }
}


-(void) insertRecordIntoTableNamed:(NSString *) tableName
                       field1Value:(NSString *) field1Value
                       field2Value:(NSString *) field2Value
                       field3Value:(NSString *) field3Value
                       field4Value:(NSString *) field4Value
                       field5Value:(NSString *) field5Value
                       field6Value:(NSString *) field6Value
                       field7Value:(NSString *) field7Value
                       field8Value:(NSString *) field8Value
                       field9Value:(NSString *) field9Value {

    NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@ VALUES ('%@','%@','%@','%@',%@,%@,'%@','%@','%@');",tableName, field1Value, field2Value,field3Value,field4Value,field5Value,field6Value,field7Value ,field8Value,field9Value];


    NSLog(@"%@",sql);

    // char *err;
    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK)
    {
        if (SQLITE_DONE!=sqlite3_step(statement))
        {
            sqlite3_close(db);
            NSAssert(0, @"Error updating table.");
        }
        else{
            NSLog(@"Success");
            NSLog(@"%@",sql);
        }
    }
    sqlite3_finalize(statement);
}

@end
以下是我所做的:

  • 使用CHMOD更改文件夹和路径权限

  • sqlite3_exec()
    拆分为
    sqlite3_prepare()
    sqlite3_step()
    sqlite3_finalize()
    -我得到相同的输出-已创建查询,但未在数据库中创建记录

  • 我能够检索记录信息

  • 如果您仅通过发布的代码与数据库交互,则缺少sqlite3\u关闭。更改很可能没有刷新到磁盘上

    您无法写入资源包中的数据库。你需要复制它,然后使用它

    下面是我成功地用来实现这一点的一些代码(密钥在从资源复制的地方被确保DatabasePrepared):


    哪一步(如果有的话)报告失败,您得到了什么错误信息?在运行项目后,如果插入数据并检索数据,我不会得到任何错误,它显示了数据,但如果我运行程序并再次尝试检索我之前输入的数据,它不会显示任何结果。您知道为什么会发生这种情况吗?感谢您的响应检查路径,请参阅,您几乎肯定在尝试对资源包中的文件进行操作,这是只读的。必须将其复制到应用程序拥有的可写目录中。@chiron,复制成功了吗?下面的答案和代码有用吗?sqlite不仅仅在关闭时刷新写入。事实上,许多单用户移动应用程序在应用程序的生命周期内保持连接打开,并避免打开/关闭成本。
    - (BOOL)ensureDatabaseOpen: (NSError **)error
    {
        // already created db connection
        if (_contactDb != nil)
        {
            return YES;
        }
    
        NSLog(@">> ContactManager::ensureDatabaseOpen");    
        if (![self ensureDatabasePrepared:error])
        {
            return NO;
        }
    
        const char *dbpath = [_dbPath UTF8String]; 
        if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
            error != nil)
        {
            *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
            return NO;
        }
    
       NSLog(@"opened");
    
        return YES;
    }
    
    - (BOOL)ensureDatabasePrepared: (NSError **)error
    {
        // already prepared
        if ((_dbPath != nil) &&
            ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
        {
            return YES;
        }
    
        // db in main bundle - cant edit.  copy to library if !exist
        NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
        NSLog(@"%@", dbTemplatePath);
    
        NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
        _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];
    
        NSLog(@"dbPath: %@", _dbPath);
    
        // copy db from template to library
        if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
        {
            NSLog(@"db not exists");
            NSError *error = nil;
            if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
            {
                return NO;
            }
    
            NSLog(@"copied");
        }    
    
        return YES;    
    }