хранить изображения в базе данных sqlite - PullRequest
1 голос
/ 04 января 2012

Ниже приведен мой код для хранения изображений в базе данных sqlite. Когда я использовал его для хранения значений, он работает, и теперь я пытаюсь сохранить изображения в базе данных sqlite. Я не знаю, что я делаю не так. Я уже искал и не могу получить ответ, что мне нужно. Кто-нибудь, помогите мне с его кодом.

 sqlite3 *database;
    dbName=@"dataTable.sqlite";
    NSArray *documentpath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentdir=[documentpath objectAtIndex:0];
    dbPath=[documentdir stringByAppendingPathComponent:dbName];
    sqlite3_stmt *compiledStmt;
   if(sqlite3_open([dbPath UTF8String], &database)==SQLITE_OK){
        NSLog(@"Name:%@,Company:%@,URL:%@",model.personName,model.companyName,model.imgurl);
        const char *insertSQL="insert into Persons(PersonName,CompanyName,ImgUrl,PersonImage)values(?,?,?,?)";
    if(sqlite3_prepare_v2(database,insertSQL, -1, &compiledStmt, NULL)==SQLITE_OK){
        sqlite3_bind_text(compiledStmt,1,[model.personName UTF8String],-1,SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStmt,2,[model.companyName UTF8String],-1,SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStmt,3,[model.imgurl UTF8String],-1,SQLITE_TRANSIENT);
        NSData *imageData=UIImagePNGRepresentation(imageView.image);
        sqlite3_bind_blob(compiledStmt, 4, [imageData bytes], [imageData length], NULL);
        NSLog(@"Prepare");
        sqlite3_step(compiledStmt);

    }sqlite3_finalize(compiledStmt);
}

UPDATE: Спасибо всем .. Я решил эту проблему, задав еще один вопрос здесь. Сохранение и извлечение изображения в базу данных sqlite для iphone Это может помочь другим.

Ответы [ 4 ]

2 голосов
/ 04 января 2012
  const char *insertSQL="insert into Persons(PersonName,CompanyName,ImgUrl,PersonImage)values(?,?)"

У вас есть 4 значения для вставки в таблицу и только 2 заполнителя для параметров.Исправьте их.

Черт, я не разработчик iOS

1 голос
/ 11 сентября 2014

вы просто добавляете libSqlite3.dylib к Linked FrameWork и Lilbraries и объявляете переменные базы данных в файле .h

  //Database Variables
  @property (strong, nonatomic) NSString *databasePath;
  @property (nonatomic)sqlite3 *contactDB;
  @property (strong, nonatomic) IBOutlet UIButton *backbtn;
  @property (strong, nonatomic) IBOutlet UIButton *forwardbtn;

перетаскиваете UIImageView и имя к этому ... я объявил как imgView.Перейти к .m файл, который вы просто скопируйте и вставьте этот код

int i=1;
long long temp=0;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. 

NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];

 // Build the path to the database file
_databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"images.db"]];
//docsDir   NSPathStore2 *  @"/Users/gayathiridevi/Library/Application Support/iPhone Simulator/7.0.3/Applications/B5D4D2AF-C613-45F1-B414-829F38344C2A/Documents"  0x0895e160
NSFileManager *filemgr = [NSFileManager defaultManager];

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

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS IMAGETB (ID INTEGER PRIMARY KEY AUTOINCREMENT,URL TEXT, CHECKSUM TEXT,IMAGE BLOB)";

        if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {

            NSLog( @"User table Not Created Error: %s", errMsg);
        }
        else
        {
            NSLog( @"User table Created: ");
        }
        sqlite3_close(_contactDB);
    }

    else {

        NSLog( @"DB Not Created");
    }
}
[self saveImage];
[self showImage];   
}
 - (void)saveImage
  {  

    sqlite3_stmt    *statement;
    const char *dbpath = [_databasePath UTF8String];

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

    NSString *insertSQL=@"INSERT INTO IMAGETB(URL,image) VALUES(?,?)";

    if(sqlite3_prepare_v2(_contactDB, [insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL)== SQLITE_OK)
    {
        //NSString *url =@"https://lh6.googleusercontent.com/-vJBBGUtpXxk/AAAAAAAAAAI/AAAAAAAAADQ/nfgVPX1n-Q8/photo.jpg";
       //NSString *url =@"http://upload.wikimedia.org/wikipedia/commons/2/2a/Junonia_lemonias_DSF_upper_by_Kadavoor.JPG";
       // NSString *url =@"http://upload.wikimedia.org/wikipedia/commons/8/84/Tibia_insulaechorab.jpg";


         NSString *url =@"http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/PNG_transparency_demonstration_2.png/280px-PNG_transparency_demonstration_2.png";
        UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]];
        NSData *imageData=UIImagePNGRepresentation(image);
          sqlite3_bind_text(statement,1, [url UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_blob(statement, 2, [imageData bytes], [imageData length], SQLITE_TRANSIENT);

         NSLog(@"Length from internet : %lu", (unsigned long)[imageData length]);

    }


    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog( @"Insert into row id %lld",(sqlite3_last_insert_rowid(_contactDB)));
        temp =(sqlite3_last_insert_rowid(_contactDB));
    }
    else {

        NSLog( @"Error IN INSERT" );
    }
    sqlite3_finalize(statement);
    sqlite3_close(_contactDB);
}   
}

 - (void)showImage
 {

 sqlite3_stmt    *statement;
  const char *dbpath = [_databasePath UTF8String];
  if(sqlite3_open(dbpath,&_contactDB)==SQLITE_OK)

{
    NSString *insertSQL = [NSString stringWithFormat:@"Select IMAGE FROM IMAGETB WHERE ID = %d",i];
    if(sqlite3_prepare_v2(_contactDB,[insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &statement, NULL) == SQLITE_OK) {
        while(sqlite3_step(statement) == SQLITE_ROW) {

            int length = sqlite3_column_bytes(statement, 0);
            NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(statement, 0) length:length];

            NSLog(@"Length from db : %lu", (unsigned long)[imageData length]);

            if(imageData == nil)
                NSLog(@"No image found.");
            else
                _imgView.image = [UIImage imageWithData:imageData];
            NSLog(@"image found.");
        }
    }
    sqlite3_finalize(statement);
}
sqlite3_close(_contactDB);
}




 -(IBAction)backBtn:(id)sender {

  if (i<=1) {}
  else{
    i=i-1;
    [self showImage];
   }  
 }
 -(IBAction)forwardBtn:(id)sender {
if(i==temp){}
else{

    i=i+1;
    [self showImage];        
}
}
0 голосов
/ 04 января 2012

Вы должны проверить возвращаемые значения bind_text и bind_blob и пошаговый вызов, распечатать сообщение об ошибке, если они не пройдут.

0 голосов
/ 04 января 2012

Я ответил на вопрос similair следующим ответом: лучше использовать CoreData. Вам будет намного проще работать с CoreDate вместо SQL. CoreData - это в значительной степени база данных SQL в красивой оболочке.

Если вы используете iOS 5, вы можете легко добавлять изображения в базу данных, не беспокоясь о том, что они являются BLOBS (Binary Large Object), установив флажок «Разрешить внешнее хранение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...