2017-04-11 80 views
1

我做了一個演示,其中存儲圖像到數據庫。目前我沒有收到任何錯誤,但我的圖像不存儲在sqlite數據庫中。 請參閱下面的代碼並告訴我我的錯誤在哪裏。圖片沒有存儲在sqlite

DBManager類

sqlite3 *sqlite3DatabaseObject; 
sqlite3_stmt* sqlite3Statement; 
-(void)database 
{ 

    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    documentsDirectory = [directoryPaths objectAtIndex:0]; 
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:databasePath] == NO) { 
     const char *dbPath = [databasePath UTF8String]; 
     if (sqlite3_open(dbPath, &sqlite3DatabaseObject)== SQLITE_OK) { 
      char * errorMessage; 
      const char *sqlite3Query = "CREATE TABLE IF NOT EXISTS PICTURES (PHOTO BLOB)"; 
      if (sqlite3_exec(sqlite3DatabaseObject, sqlite3Query, NULL, NULL, &errorMessage)!= SQLITE_OK) { 
       NSLog(@"failed = %@",sqlite3DatabaseObject); 
      } 
      sqlite3_close(sqlite3DatabaseObject); 
     }else{ 
      NSLog(@"failed to create database"); 
     } 
    } 
} 
- (void) SaveImagesToSql: (NSData*) imgData { 

    NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"informationdb" ofType:@"sql"]; 

    const char* sqlite3Query = "INSERT INTO PICTURES (PHOTO) VALUES (?)"; 
    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL); 
    if (openDatabaseResult == SQLITE_OK) { 
     int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL); 
     if(sqlite3Prepare == SQLITE_OK) { 
      sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT); 
      sqlite3_step(sqlite3Statement); 
     } 
     else 
     { 
      NSLog(@"Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 
     } 
     sqlite3_finalize(sqlite3Statement); 

    } 
    else NSLog(@"Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 
    sqlite3_close(sqlite3DatabaseObject); 
} 

的ViewController類

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    DBManager * dbmClass = [[DBManager alloc]init]; 
    [dbmClass database]; 

    imgView.userInteractionEnabled = YES; 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(uploadOrCapture)]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [imgView addGestureRecognizer:singleTap]; 

} 
- (IBAction)btnSave:(id)sender { 
    DBManager*dbmClass = [[DBManager alloc]init]; 
    NSData *imageInData = UIImagePNGRepresentation(imgView.image); 
    [dbmClass SaveImagesToSql:imageInData]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

我無法找出問題。它成功執行所有代碼,但是當我從設備下載數據庫並進行檢查時,沒有存儲圖像數據。

在此先感謝。
Mihir。

+1

建議:店面形象到本地目錄並保存目錄路徑到sqlite的分貝。 – Shahrukh

+0

你可以有任何教程鏈接嗎? –

+0

您可以保存在文件目錄中的圖像和圖片的路徑存儲在數據庫中。 –

回答

3

只需更換這個功能對我的代碼,因爲你得到了錯誤的數據庫路徑

- (void) SaveImagesToSql: (NSData*) imgData { 

    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    documentsDirectory = [directoryPaths objectAtIndex:0]; 
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]]; 

    const char* sqlite3Query = "INSERT INTO PICTURES (PHOTO) VALUES (?)"; 
    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL); 
    if (openDatabaseResult == SQLITE_OK) { 
     int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL); 
     if(sqlite3Prepare == SQLITE_OK) { 
      sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT); 
      sqlite3_step(sqlite3Statement); 
     } 
     else 
     { 
      NSLog(@"Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 
     } 
     sqlite3_finalize(sqlite3Statement); 

    } 
    else NSLog(@"Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 
    sqlite3_close(sqlite3DatabaseObject); 
} 

,這是這裏的數據庫截圖

enter image description here

不要拖到數據庫中的任何project.if問題不是告訴我

+0

OK讓我查一下。 –

+0

感謝Buddy它的工作。 –

+0

@MihirOza歡迎 – iOS

0

在這裏我如何根據您的使用進行修改。

NSData *imageData = UIImagePNGRepresentation(imgView.image); 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeStyle: NSDateFormatterShortStyle]; 
dateFormatter.dateFormat = @"ddMMyyyyhhmmss_SSS_a"; 
NSString *currentTime = [dateFormatter stringFromDate: [NSDate date]]; 

NSString *imageName=[NSString stringWithFormat:@"Image_%@",currentTime]; 

NSString *saveFilePath =[NSString stringWithFormat:@"%@.%@",imageName,@"png"]; //Store saveFilePath string to your database 

NSString *localFilePath1 = [documentsDirectory stringByAppendingPathComponent:saveFilePath]; 

[imageData writeToFile:localFilePath1 atomically:YES]; 

希望它可以幫助你。