2014-06-25 52 views
1

我正在將一個NSMutableDictionary存儲到一個sqlite數據庫中。我成功地存儲了它。我的問題是檢索它。我想檢索NSMutableDictionary作爲一個整體,並將其分配給另一個NSMutableDictionary,以便我可以開始使用它。從iOS中的Sqlite中檢索字典

以下代碼允許我檢索文本數據類型並將其分配給addressField,但我無法弄清楚如何從數據庫中檢索帶有數據類型blob的NSMutableDictionary。

while (sqlite3_step(statement) == SQLITE_ROW){ 
    NSString *addressField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
} 

林不知道如何開始的NSMutableDictionary這樣我就可以使用sqlite3_column_blob 功能就可以了。

這是我的保存到數據庫代碼。

  //This is the nsdictionary that Im going to save in the database 
      NSMutableDictionary *thisTicket = [[NSMutableDictionary alloc]init]; 
      [thisTicket setValue:globalData.vehicleYear forKey:@"vehicleYear"]; 
      [thisTicket setValue:globalData.vehicleMake forKey:@"vehicleMake"]; 
      [thisTicket setValue:globalData.vehicleModel forKey:@"vehicleModel"]; 
      [thisTicket setValue:globalData.ticket forKey:@"ticketNumber"]; 

      //open database and save 
      sqlite3_stmt *statement; 
      const char *dbpath = [_databasePath UTF8String]; 

      if (sqlite3_open(dbpath, &_ticketDB) == SQLITE_OK) 
      { 

       NSString *insertSQL = [NSString stringWithFormat: 
             @"INSERT INTO TICKETS (user, ticketnum, ticketinfo) VALUES (\"%@\", \"%@\", \"%@\")", 
             [[PFUser currentUser]objectId], globalData.ticket, thisTicket]; 

       const char *insert_stmt = [insertSQL UTF8String]; 
       sqlite3_prepare_v2(_ticketDB, insert_stmt, 
            -1, &statement, NULL); 
       if (sqlite3_step(statement) == SQLITE_DONE) 
       { 
        NSLog(@"Added"); 

       } else { 
        NSLog(@"Failed to add contact"); 
       } 
       sqlite3_finalize(statement); 
       sqlite3_close(_ticketDB); 
      } 

我保存後,這裏是我的數據庫看起來像(我使用SqliteManager來查看數據庫)。 Ticketinfo是具有我的NSMutableDictionary(在上面的代碼中命名爲thisTicket)的列。

我還沒有足夠的知名度,可以添加照片。我已經賺了一些,然後添加它

這是我的代碼來檢索NSDictionary。

NSString *docsDir; 
NSArray *dirPaths; 
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
docsDir = dirPaths[0]; 
_databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"tickets.db"]]; 

NSFileManager *filemgr = [NSFileManager defaultManager]; 

if ([filemgr fileExistsAtPath: _databasePath ] == NO) 
{ 
}else{ 
    const char *dbpath = [_databasePath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(dbpath, &_ticketDB) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT ticketinfo FROM tickets WHERE user=\"%@\"", 
           [[PFUser currentUser] objectId]]; 

     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(_ticketDB, 
           query_stmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 


       NSUInteger blobLength = sqlite3_column_bytes(statement, 5); 
       NSData *data = [NSData dataWithBytes:sqlite3_column_blob(statement, 5) length:blobLength]; 

       NSDictionary *dict=[NSJSONSerialization 
              JSONObjectWithData: data 
              options:NSJSONReadingMutableLeaves 
              error:nil]; 
       NSLog(@"%@",dict); 

      } 
      sqlite3_finalize(statement); 
     } 
     sqlite3_close(_ticketDB); 
    } 
} 

Im NS記錄字典作爲它循環通過行,所以我可以看到它,但它顯示爲空。

回答

4

sqlite3_column_blob的意志帶給你的NSDictionary中的NSData形式:

NSUInteger blobLength = sqlite3_column_bytes(statement, colNo); 
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(statement, colNo) length:blobLength]; 

,那麼你必須將其轉換回的NSDictionary:

NSDictionary *dictionary=[NSJSONSerialization 
     JSONObjectWithData: data 
        options:NSJSONReadingMutableLeaves 
        error:nil]; 
+0

由於V-復刻。在沒有得到任何錯誤,但是當我NSLog字典查看它後面什麼,它的空。代碼中的8代表什麼意思? – adrian1kat

+0

我編輯了我的問題。基本上第二個參數應該是你的列號。試試吧。 –

+0

當我NSLog字典時仍然收到空。我會發布完整的保存代碼,保存後數據庫的外觀圖片,以及我的檢索代碼。我用這段代碼編輯我原來的問題。 – adrian1kat