Ανάγνωση και γραφή εικόνων σε SQLite DB για χρήση iPhone

ψήφοι
22

Έχω δημιουργήσει ένα DB SQLite που διαβάζει το παρόν και γράφει NSStrings τέλεια. Θέλω επίσης να αποθηκεύσετε μια εικόνα στη βάση δεδομένων και να το ανακαλέσει αργότερα. Έχω διαβάσει ένα κομμάτι σχετικά με τη χρήση NSDataκαι το οποίο κωδικοποιεί την εικόνα, αλλά δεν είμαι απόλυτα σίγουρος ποια είναι η σύνταξη είναι για αυτό που θέλω να κάνω. Οποιεσδήποτε δημιουργίας ενός κώδικα ή παραδείγματα θα ήταν ευγνώμονες.

Τρέχουσα διαδικασία μου πάει κάπως έτσι: UIImagePickerController-> χρήστης επιλέγει Εικόνα από φωτογραφίες -> chosenImage έχει οριστεί σε περίπτωση UIImageView-> Τώρα θέλω να εκμεταλλευτώ αυτή την εικόνα και να το αποθηκεύσετε στο ΣΠ

Θα ήθελα να αναφέρω αυτό το κάλεσμα τελικά θα αντικατασταθεί με μια κλήση σε έναν απομακρυσμένο server. Δεν είμαι σίγουρος αν αυτό κάνει τη διαφορά όσον αφορά τις επιδόσεις πηγαίνει.

Δημοσιεύθηκε 13/03/2009 στις 18:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
31

Θα πρέπει να μετατρέψετε το UIImage φιλοξενείται μέσα UIImageView σας σε ένα δυαδικό BLOB για αποθήκευση σε SQLite. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το ακόλουθο:

NSData *dataForImage = UIImagePNGRepresentation(cachedImage);
sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);

Αυτό θα δημιουργήσει μια αναπαράσταση PNG της εικόνας σας, αποθηκεύστε το σε μια περίπτωση NSData, και στη συνέχεια να δεσμεύσουν το byte από το NSData ως BLOB για το δεύτερο επιχείρημα στο ερώτημα SQL σας. Χρησιμοποιήστε UIImageJPEGRepresentation στο παραπάνω για να αποθηκεύσει σε αυτή τη μορφή, αν θέλετε. Θα πρέπει να έχει μια στήλη BLOB προστίθεται στο κατάλληλο πίνακα στη βάση δεδομένων SQLite σας.

Για να ανακτήσετε αυτή την εικόνα, μπορείτε να χρησιμοποιήσετε το ακόλουθο:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Απαντήθηκε 13/03/2009 στις 18:41
πηγή χρήστη

ψήφοι
9

Σύσταση της Apple δεν είναι να αποθηκεύσετε BLOB σε SQLite βάσεις δεδομένων που είναι μεγαλύτερα από ~ 2 kilobytes.

SQLite οργανώνει βάσεις δεδομένων στις σελίδες. Κάθε σελίδα είναι 4 kilobytes σε μέγεθος. Όταν διαβάσει δεδομένα από το αρχείο της βάσης δεδομένων SQLite φορτώνει τις σελίδες σε μια εσωτερική μνήμη cache της σελίδας. Στο iPhone νομίζω ότι αυτό κρυφής μνήμης προεπιλογές για 1 megabyte σε μέγεθος. Το γεγονός αυτό καθιστά την ανάγνωση δίπλα αρχεία πολύ γρήγορα, διότι θα είναι κατά πάσα πιθανότητα στη μνήμη cache σελίδα ήδη.

Όταν SQLite διαβάζει το αρχείο βάσεων δεδομένων σας στη μνήμη διαβάζει ολόκληρο το αρχείο και όλες τις σελίδες που καταλαμβάνει. Έτσι, αν το αρχείο σας περιέχει μια σταγόνα, θα μπορούσε να καταλάβει πολλές σελίδες και θα εξάγει τις υπάρχουσες σελίδες από τη μνήμη cache και την αντικατάστασή τους με τις σελίδες ρεκόρ BLOB σας.

Αυτό δεν είναι τόσο κακό, αν είστε απλά σάρωση μέσω και τη φόρτωση όλων των σταγόνες σας για να κάνετε κάτι μαζί τους (εμφάνιση τους, για παράδειγμα). Αλλά αν πούμε ότι κάναμε ένα ερώτημα στο οποίο θα ήθελα να πάρετε κάποια δεδομένα που είναι στην ίδια σειρά με το BLOB αυτό το ερώτημα θα ήταν πολύ πιο αργή από ό, τι αν το αρχείο δεν περιέχει το μεγάλο BLOB.

Έτσι, κατ 'ελάχιστο θα πρέπει να αποθηκεύσετε τα δεδομένα BLOB σας σε έναν ξεχωριστό πίνακα. Π.χ:

CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER, 
    FOREIGN KEY(blob_id) REFERENCES blobs(id) );

Ή ακόμα καλύτερα, να αποθηκεύσει τα δεδομένα BLOB ως αρχεία έξω από τη βάση δεδομένων SQLite.

Σημειώστε ότι μπορεί να είναι δυνατόν να αλλάξουν το μέγεθος σελίδας μνήμης cache με δηλώσεις SQL PRAGMA (αν δεν χρησιμοποιείτε CoreData).

Απαντήθηκε 15/04/2011 στις 11:21
πηγή χρήστη

ψήφοι
9

Μια επιλογή (και γενικά προτιμάται όταν εργάζονται σε SQL) είναι να γράψει την εικόνα σε ένα αρχείο στο σύστημα και αποθηκεύει τη διαδρομή (ή κάποιο άλλο είδος αναγνωριστικού) στη βάση δεδομένων.

Απαντήθηκε 13/03/2009 στις 18:32
πηγή χρήστη

ψήφοι
2

Γράφοντας στην εικόνα για SQLite DB

if(myImage != nil){
    NSData *imgData = UIImagePNGRepresentation(myImage);
    sqlite3_bind_blob(update_stmtement, 6, [imgData bytes], [imgData length], NULL);    
    }
    else {
        sqlite3_bind_blob(update_stmtement, 6, nil, -1, NULL);
    }

Ανάγνωση Από SQLite DB:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(init_statement, 6) length:sqlite3_column_bytes(init_statement, 6)];
        if(data == nil)
            NSLog(@"No image found.");
        else
            self.pictureImage = [UIImage imageWithData:data];   
Απαντήθηκε 29/01/2010 στις 14:05
πηγή χρήστη

ψήφοι
0

θα πρέπει πρώτα να γράψετε την εικόνα στο σύστημα αρχείων. και στη συνέχεια να ακολουθήσει το δρόμο της εικόνας και να αποθηκεύσετε αυτό το μονοπάτι της εικόνας (URL) ως κείμενο στο SQLite.

Απαντήθηκε 27/05/2015 στις 07:08
πηγή χρήστη

ψήφοι
0

Η καλύτερη πρακτική είναι να συμπιέσει την εικόνα και να την αποθηκεύσετε στο σύστημα βάσης δεδομένων ή αρχείο. Αν δεν νοιάζονται για την ανάλυση της εικόνας, μπορείτε να προχωρήσετε και ακόμα και να αλλάξετε το μέγεθος της εικόνας με τη χρήση:

   UIGraphicsBeginImageContext(newSize);  
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];   
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    
   UIGraphicsEndImageContext();

Μετά από αυτό μπορείτε να χρησιμοποιήσετε UIImageJPEGRepresentationγια εικόνες JPEG με τιμή «0» για μέγιστη συμπίεση. Ή μπορείτε να χρησιμοποιήσετε UIImagePNGRepresentationγια png εικόνες

Απαντήθηκε 05/07/2012 στις 13:21
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more