2

ターミナルを使用しMacOSて、データベース名データベースを作成しました。sqlいくつかのレコードを挿入しました。I を使用iOSすると、挿入された値を取得できます。

しかし、iOSコードを使用してデータベースにレコードを挿入しようとしましたが、データベースにレコードが入力されません。

いくつかの権限を設定する必要性を設定する必要がありますか? これは私のコードです:

- (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

これが私がやったことです:

  1. CHMOD を使用してフォルダーとパスのアクセス許可を変更する

  2. に分割sqlite3_exec()sqlite3_prepare()sqlite3_step()-sqlite3_finalize()同じ出力が得られます-クエリは作成されますが、データベースにレコードは作成されません

  3. レコード情報を取得できます
4

2 に答える 2

2

リソース バンドル内のデータベースに書き込むことはできません。コピーしてから使用する必要があります。

これを行うために私がうまく使用したコードを次に示します(キーは、リソースからコピーされる ensureDatabasePrepared です)。

- (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;    
}
于 2013-01-10T12:41:40.510 に答える
0

投稿したコードからのみデータベースとやり取りしている場合は、sqlite3_close がありません。ほとんどの場合、変更がディスクにフラッシュされていません

于 2013-01-10T12:41:29.080 に答える