2012-04-19 28 views
1

に挿入データは、私はテーブルからデータを選択しようとした一方で:SQLiteのSELECTデータベース

NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; 
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) { 
     const char *sql = "SELECT name FROM Artists ORDER BY name"; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { 
      while (sqlite3_step(statement) == SQLITE_ROW) { 


       char *nameChars = (char *)sqlite3_column_text(statement, 0); 
       NSString *name = [NSString stringWithUTF8String: nameChars]; 

       [tmpArray addObject:name]; 
      } 
     }else { 
      NSLog(@"Error"); 
     } 
    }else { 
     NSLog(@"Error1"); 
    } 

私はこれを選択し、私はこれで、データベース内の別の表にデータを挿入する時間で実行します。

-(void)insertAutpPlaylist:(NSString*)playlistName withPlaylist:(NSMutableArray*)songsArray{ 
    if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) { 
     for (int i = 0 ; i < [songsArray count]; i++) { 

      SongItem *song = [songsArray objectAtIndex:i]; 

      sqlite3_stmt *insertStmt = nil; 

      NSString *name = song.name; 

      if(insertStmt == nil) 
      { 
       NSString *statement = [NSString stringWithFormat:@"INSERT INTO %@ (name) VALUES (?)",playlistName]; 
       const char *insertSql = [statement UTF8String]; 

       if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){ 
        NSLog(@"Error while creating insert statement."); 
        insertStmt = nil; 
        continue; 
       } 

       sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT); 

       if(SQLITE_DONE != sqlite3_step(insertStmt)){ 
        //NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
        NSLog(@"Error while inserting data."); 
        insertStmt = nil; 
        continue; 
       } 
       else{} 

       sqlite3_reset(insertStmt); 
       insertStmt = nil; 
      } 

     } 

     sqlite3_close(database); 
    } 
} 

このコードは、データを挿入せずに同じ時刻に選択し、挿入と選択が別のテーブルにある場合に問題ありません。

編集

私が作ってみる

私は「エラー」の出力から取得選択:のNSLog(「エラー」@)。

編集2

私はコンソールで取得selectメソッドにsqlite3_errmsg(database)を追加する場合:選択クエリの後

reason: 'Error while inserting data. 'database is locked' 
+0

あなたはそれについての火災の問い合わせの前にデータベースをオープンしていますか(sqlite3_open([/ * datab aseパス*/UTF8String]、&データベース)!= SQLITE_OK) – priyanka

+0

2つの異なるスレッドから同時に2つの異なるテーブルになっていても、データベースにアクセスすることはできません。 – coder

+0

私は選択するだけですか? – MTA

答えて

1

sqlite3_finalize(statement); 

SQL文を確定し、あなたを解決してください。問題