2014-03-27 136 views
0

所以我正在做的是用戶從相機膠捲中選擇一個圖像,我設置了一個imageView與該圖像。到現在爲止還挺好。現在我需要將此圖像保存到我的數據庫中。因此,當下次加載視圖時,我再次選擇了該圖像。問題是我的圖像視圖沒有與圖像設置。可能是因爲它沒有正確保存到我的數據庫。從我讀NSData是最好使用和它正在使用,但沒有成功。有人可以幫助解決我的問題嗎?將圖像從UIImagePicker保存到Sqlite數據庫

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 

    [self dismissViewControllerAnimated:YES completion:nil]; 
    fsImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    fsUIImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    imgData = UIImagePNGRepresentation(fsUIImage); 
    [self saveImageToDatabase]; 

} 

------我在這裏我的圖像保存到數據庫-------

-(void)saveImageToDatabase{ 

    [self openDB]; 

    sqlite3_stmt *newstatement; 

    int originalTotalCount = sqlite3_total_changes(db); 

    NSString *sql = [NSString stringWithFormat:@"UPDATE Annotation SET image = '%@' WHERE title ='%@'", imgData, fsTitleName]; 
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &newstatement, nil) != SQLITE_OK) { 
     NSLog(@"%s: prepare failed: %s", __FUNCTION__, sqlite3_errmsg(db)); 
    } else { 
     if (sqlite3_step(newstatement) != SQLITE_DONE) { 
      NSLog(@"%s: step failed: %s", __FUNCTION__, sqlite3_errmsg(db)); 
     } else { 
      int rowsUpdated = sqlite3_total_changes(db) - originalTotalCount; 

      NSString *message; 

      if (rowsUpdated == 1) 
       message = @"Updated one row"; 
      else if (rowsUpdated == 0) 
       message = @"No rows updated"; 
      else 
       message = [NSString stringWithFormat:@"Updated %d rows", rowsUpdated]; 

      NSLog(@"%@", message); 

      sqlite3_step(newstatement); 
     } 

     sqlite3_finalize(newstatement); 
    } 
    sqlite3_close(db); 

} 

------在這裏,我拉我的形象從DB- ------被調用時viewLoads ..

-(void)setImage{ 

    [self openDB]; 

    NSString *sql = [NSString stringWithFormat:@"SELECT image FROM Annotation WHERE title = '%@'",fsTitleName]; 

    sqlite3_stmt *statement; 

    if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK){ 

     int rc; 
     if ((rc = sqlite3_step(statement)) == SQLITE_ROW) { 
      char *field1 = (char *) sqlite3_column_text(statement, 0); 
      NSString *field1Str = [[NSString alloc]initWithUTF8String:field1]; 
      imgData = [field1Str dataUsingEncoding:NSUTF8StringEncoding]; 
      [fsImageView setImage:[UIImage imageWithData: imgData]]; 

     } else if (rc != SQLITE_DONE) { 
      NSLog(@"%s: sqlite3_step failed: %s", __FUNCTION__, sqlite3_errmsg(db)); 
     } 
    } else { 
     NSLog(@"%s: sqlite3_prepare_v2 failed: %s", __FUNCTION__, sqlite3_errmsg(db)); 
    } 

    sqlite3_finalize(statement); 
    sqlite3_close(db); 


} 
+0

檢查此問題:http://stackoverflow.com/questions/3319791/inserting-nsdata-into-sqlite-on-the-iphone而且我也同意,最好將圖像保存到磁盤(如在文檔目錄),並且只有數據庫中文件的路徑(如果需要的話)。 –

回答

1

在你的情況你獲得成功的圖像,並將其轉換爲NSData的存儲在sqlite的,唯一的問題你面對被存儲的NSData到sqlite的。

將NSData保存到sqlite數據庫中需要將它保存爲sqlite中的字節,因此要麼以字節存儲NSData,要麼將其轉換爲Base64字符串,然後在sqlite中打包Base64字符串。

要存儲的NSData在SQLite作爲字節可以參考下面的聯繫:

1)How to retrieve string from NSData stored in sqlite?

2)Retrieve nsdata from sqlite stored in Blob data type for iPhone App

要存儲的NSData SQLite中爲Base64則可以使用下面的Base64庫,它是非常容易使用。

https://github.com/nicklockwood/Base64

我們一個NSData的轉換爲Base64只使用下面的代碼:

NSString *aStrData = [theNSDataObject base64EncodedString]; 

然後你從數據庫讀取後的Base64編碼字符串轉換回NSData的象下面這樣:

NSData *theNSDataObject = [aStrData base64DecodedData]; 

我更喜歡使用Base64字符串是一種好方法,所以如果將來如果您想將圖像發送到任何Web服務,您也可以使用base64格式發送它。

+0

謝謝soooooo多!你引導我朝着正確的方向......向其他人尋求幫助這個問題的答案很好,正是我所需要的。http://stackoverflow.com/questions/19088231/base64-decoding-in-ios-7 – 4GetFullOf

0

//使用這個代碼插入

NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO <Table Name> (Image) VALUES (?)"]; 

     const char *insert_stmt = [insertSQL UTF8String]; 

     if(sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL)== SQLITE_OK) 
     { 

      sqlite3_bind_blob(statement, 1, [imageData bytes],(unsigned int) [imageData length], SQLITE_TRANSIENT); 
     } 

//使用此代碼從UIImagePicker檢索

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

     NSString *querySQL = [NSString stringWithFormat: 
           @"SELECT * FROM <Table Name>" ]; 
     const char *query_stmt = [querySQL UTF8String]; 

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


       int blobBytesLength = sqlite3_column_bytes(statement, 1); 
       NSData *blobData = [[NSData alloc]initWithBytes:sqlite3_column_blob(statement, 1)length:blobBytesLength]; 

       UIImage *imagetest = [[UIImage alloc] initWithData:blobData];//this is your Image 
      } 
     } 
+0

這不工作..仍然有問題 – 4GetFullOf

+0

可以ü分享錯誤 –

+0

沒有錯誤給出..編譯和運行良好只是沒有圖像後顯示後我運行您提供的代碼來檢索圖像 – 4GetFullOf

相關問題