2012-05-03 21 views
2

sqlite iPhoneのテーブルにデータを挿入するには?SQLiteデータベースにデータを挿入する正しい方法iPhone

私は、次のしようが、その失敗しています:

NSString *query=[NSString stringWithFormat:@"insert into %@ (name) values ('%@')", table name,myName ]; 


sqlite3 *database; 

sqlite3_stmt *createStmt = nil; 

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    if (createStmt == nil) { 

     if (sqlite3_prepare_v2(database, [query UTF8String], -1, &createStmt, NULL) != SQLITE_OK) { 
      return NO; 
     } 
     sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL); 
     return YES; 
    } 

    return YES; 
}else { 
    return NO; 
} 

私は方法を次の表を作成しました:

create table if not exists myDets (dets_id integer primary key asc, name text); 

私はまた、デシベルをチェックするためにFirefoxのSQLiteのプラグインを使用しています。 ?私は私のDBにFirefoxを経由して、レコードを挿入しようとすると、それは私に次のエラー与える:ひどく立ち往生

Failed to insert values 
Exception Name: NS_ERROR_STORAGE_IOERR 
Exception Message: Component returned failure code: 0x80630002 (NS_ERROR_STORAGE_IOERR)  [mozIStorageStatement.execute] 

:(また

、私はそれは問題ではない、iPhoneシミュレータ上でこれを実行していますが

事前に

感謝を助けてください。

答えて

3
  • 使用パラメータとないではない文字列フォーマットあなたの更新のtatement
  • 多くのトレースを追加し、戻りコードをチェックし、エラーコードを確認します(あなたはiPhoneでどんなエラーが発生しているのかは分かりません)。
  • sqlite3_errmsgを使用してエラーメッセージを取得する
  • dbPathを構成してログアウトします。エミュレータの下のターミナルからdbを開くことができることを確認してください。 sqliteはデータベースを受動的にメモリに作成するので、パスがオフでdbが存在しない場合は混乱する可能性があります。
  • あなたの更新ステートメントを印刷して、ログインしたパスにある端末のsqlite cmdlineアプリから試してみてください。
  • dbをメインバンドルのリソースに入れているのであれば、それはテンプレートなので、オープンして書き込むためにコピーする必要があります。

はここで私のサンプルからの更新機能です:サンプルで

- (void)updateContact: (Contact*)contact error:(NSError**)error 
{ 
    if (![self ensureDatabaseOpen:error]) 
    { 
     return; 
    } 

    NSLog(@">> ContactManager::updateContact"); 

    // prep statement 
    sqlite3_stmt *statement; 
    NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?"; 
    NSLog(@"query: %@", querySQL); 
    const char *query_stmt = [querySQL UTF8String]; 

    // preparing a query compiles the query so it can be re-used. 
    sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);  
    sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]); 

    NSLog(@"bind name: %@", [contact name]); 
    NSLog(@"bind address: %@", [contact address]); 
    NSLog(@"bind phone: %@", [contact phone]); 
    NSLog(@"bind int64: %qi", [[contact id] longLongValue]); 

    // process result 
    if (sqlite3_step(statement) != SQLITE_DONE) 
    { 
     NSLog(@"error: %s", sqlite3_errmsg(_contactDb)); 
    } 

    sqlite3_finalize(statement); 
} 

、DBはパスへのリソースからコピーして開いています。ここで開かれた機能を確保私はそれを行うために使用しています:

- (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;  
} 
+0

おかげbryanmac、試してみます... – iOSDev

+0

グレート!それも私のために働く。 –

3
- (NSString *) getDBPath { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"iHadDB.sqlite"]; 
} 

- (void) insertValueToDatabase { 

    NSString *dbPath =[self getDBPath]; 

    NSString *select_Meal = dummy_select_Meal; 
    NSString *dateTime = dummy_date_Time; 
    NSString *location = dummy_location; 
    NSString *mealItem = dummy_mealItem; 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

     const char *sqlDB = "Insert into iHad(Mealtype,DateAndTime,Location,Mealitem) VALUES (?,?,?,?)"; 

     if(sqlite3_prepare_v2(database, sqlDB, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 

     sqlite3_bind_text(addStmt, 1, [select_Meal UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 2, [dateTime UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 3, [location UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 4, [mealItem UTF8String], -1, SQLITE_TRANSIENT); 

     if(SQLITE_DONE != sqlite3_step(addStmt)) 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
     //else 
      //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid 
      //coffeeID = sqlite3_last_insert_rowid(database); 

     //Reset the add statement. 
     sqlite3_reset(addStmt); 

    } 
    else 
     sqlite3_close(database); 

} 
関連する問題