2012-03-13 12 views
0

私は、2つの列を組み合わせ(テキスト)、フラグ(数値)として持つテーブルを持っています。私は、選択クエリでwhere句を使用して組み合わせ値に応じてフラグの値を取得しようとしています。データベースから特定のデータをフェッチするのが難しい

問題は、組み合わせ値が1から始まっている場合です。ここでは、組み合わせ= '1001'の場合、テーブルからのフラグの正しい値を取り出すが、0から始まっているときなどである。組み合わせ= '0010'の場合、データベースからは何も検索されません。私はコードをデバッグしましたが、この理由はありません。以下はデータベースイメージです。

This is table having two columns.

-(void)fetchfromDatabase 
{ 
     sqlite3 *database; 

NSString *strPath = [[NSBundle mainBundle]pathForResource:@"ken" ofType:@"db"]; 
NSLog(@"DBPath : %@",strPath); 

const char *dbPath = [strPath UTF8String]; 

if(sqlite3_open(dbPath, &database)==SQLITE_OK) 
{ 
    NSLog(@"Database is Ok"); 

    // const char *cConcate = [concate UTF8String]; 
    NSString *query = [NSString stringWithFormat:@"select * from kentable where combination =%@",concate]; 
    NSLog(@"final concate in database:%@",concate); 
    NSLog(@"Query:%@",query); 
    const char *sqlQuery =[query cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSLog(@"char query %s", sqlQuery); 
    sqlite3_stmt *queryStatement; 

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK) 
    { 
     NSLog(@"Conversion is Ok"); 


     while (sqlite3_step(queryStatement)==SQLITE_ROW) 
     { 
      NSLog(@"in While Statement of row"); 
      int flag=sqlite3_column_int(queryStatement, 1); 

      NSLog(@"question 5:%d",flag); 
     } 
     sqlite3_reset(queryStatement); 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    } 

    sqlite3_close(database); 

} 

}

+1

私はあなたのクエリに引用符を追加したいと思うかもしれないと思います。私はCoreDataでsqliteを使用する方が好きです。 – govi

+0

コアデータを使用してください!方法は速く、管理するコードが少なくて済みます。あなたは選択文を書かないでしょう。 –

+0

@goviあなたは正しいです。たくさんありがとうございます。それは正常に働いた。 –

答えて

1

私はまた、タスクのこの種を持っています...それがうまく機能しています...ただ、

NSStringのことで、あなたのコードを変更*データ= [自己の状態:組み合わせ];

-(NSString *) status:(NSString *)concate 
    { 
    databasePath = [[NSString alloc] initWithString: [[NSBundle mainBundle] pathForResource:@"ken" ofType:@"db"]]; 
     sqlite3_stmt *statement; 
     NSString *aName; 
     const char *dbpath = [databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      NSString *querySQL = [NSString stringWithFormat: 
            @"SELECT combination, flag FROM details WHERE combination =\"%@\"", 
            concate]; 

      const char *query_stmt = [querySQL UTF8String]; 
      sqlite3_prepare_v2(database, 
           query_stmt, -1, &statement, NULL); 
      if (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       // Read the data from the result row 
       aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 

       NSLog(@"same %@" ,aName) ; 

      } 
      else 
      { 
       aName=nil; 
      } 

    sqlite3_finalize(statement); 
      sqlite3_close(database); 

     } 


[databasePath release]; 
    return aName; 
} 
3

コードを次のように変更してみてください。気にしないでください。しかし、SQLクエリーを準備するのは、標準的な方法に従うことをお勧めします。 sqlite3_bind_text機能を使用して文字列をバインドすることができます。

if(sqlite3_open(dbPath, &database)==SQLITE_OK) 
{ 
    const char *sqlQuery = "select * from kentable where combination = ?"; 
    sqlite3_stmt *queryStatement; 

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK) 
    { 
     NSLog(@"Conversion is Ok"); 
     sqlite3_bind_text(insertStmt,1, [concate UTF8String], -1, SQLITE_TRANSIENT);  

     while (sqlite3_step(queryStatement)==SQLITE_ROW) 
     { 
      NSLog(@"in While Statement of row"); 
      int flag=sqlite3_column_int(queryStatement, 1); 

      NSLog(@"question 5:%d",flag); 
     } 
     sqlite3_reset(queryStatement); 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    } 
    sqlite3_close(database); 
} 
+0

これはあなたを助けましたか? ? –

関連する問題