5 Stimmen

Speichern von Bilddaten in einer SQLite-Datenbank auf dem iPhone

Ich möchte Bilddaten in meine SQLite-Datenbank speichern, aber ich kann es nicht tun ...

- (void) SaveData: (Article*) article :(NSMutableArray*) rssList
{
    sqlite3_stmt *statement;

    if (sqlite3_open([self.dataBasePath UTF8String], &articlesDB) == SQLITE_OK)
    {
        NSString* sqlFormat = @"INSERT INTO ARTICLES (guid, title, summary, mainLink, pubDate, author, imageLink, body, favorites, smallImage) VALUES ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@', ?)";
        // Korrekte Zusammenfassung.
        NSString* summary = [NSString stringWithString:article.summary];
        summary = [summary stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
        // Korrekter Titel
        NSString* title = [NSString stringWithString:article.title];
        title = [title stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
        // Korrekter Körper
        NSString* body = [NSString stringWithString:article.body];
        //body = [body stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
        // Erstelle Insert-SQL-Abfrage.
        NSString* insertSQL = [NSString stringWithFormat:sqlFormat, article.guid, title, summary, article.mainLink, article.pubDate, article.author, article.imageLink, body, article.favorite ? @"YES" : @"NO"];
        // Zur Datenbank hinzufügen.
        sqlite3_prepare_v2(articlesDB, [insertSQL UTF8String], -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            // Zur Liste hinzufügen.
            [rssList addObject:article];
            // Protokoll schreiben.
            NSLog( @"Artikel hinzugefügt ... " );
        } 
        else
        {
            NSLog( @"Fehler beim Hinzufügen des Artikels. Fehler ist:  %s", sqlite3_errmsg(articlesDB) );
        }

        sqlite3_finalize(statement);
        sqlite3_close(articlesDB);
    }
}

Sie können sehen, dass ich eine Abfrage habe und am Ende ein kleines Bild und Wert (?) vorhanden sind.

@"INSERT INTO ARTICLES (guid, title, summary, mainLink, pubDate, author, imageLink, body, favorites, smallImage) VALUES ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@', ?)";

Ich habe eine Funktion, die den Bildwert irgendwo in meinem Programm aktualisieren muss: In dieser Funktion wähle ich die Zeile mit dem Bildlink-URL aus, wenn ich versuche, Daten in die letzte Spalte "SMALLIMAGE" zu schreiben, aber ohne Ergebnis ... Wenn ich meine Datenbankdatei mit einem Editor öffne, sehe ich nur "NULL" in der letzten Zeile, als ob meine Daten nicht gespeichert wären ...

- (void) SaveSmallImage: (NSData*) imgData :(NSString*) mainUrl
{
    if (sqlite3_open([self.dataBasePath UTF8String], &articlesDB) == SQLITE_OK) 
    {
        NSString* sqliteQuery = [NSString stringWithFormat:@"SELECT * FROM ARTICLES WHERE IMAGELINK =  '%@'", mainUrl]; 
        sqlite3_stmt* statement;

        if( sqlite3_prepare_v2(articlesDB, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK ) 
        {
            sqlite3_bind_blob(statement, 9, [imgData bytes], [imgData length], SQLITE_TRANSIENT);
            sqlite3_step(statement);
        }
        else
        {
            NSLog( @"SaveBody: Fehler bei sqlite3_prepare_v2. Fehler ist:  %s", sqlite3_errmsg(articlesDB) );
        }

        // Abschließen und Datenbank schließen.
        sqlite3_finalize(statement);
        sqlite3_close(articlesDB);
    }
    else 
    {
        NSLog(@"SaveSmallImage: Fehler bei sqlite3_open. Fehler ist: %s", sqlite3_errmsg(articlesDB) );
    }
}

Wer kann mir sagen, was ich falsch mache ...

0 Stimmen

Hier ist die Tabellenerstellung const char* sql_stmp = "CREATE TABLE IF NOT EXISTS ARTICLES (GUID TEXT UNIQUE, TITLE TEXT, SUMMARY TEXT, MAINLINK TEXT, PUBDATE TEXT, AUTHOR TEXT, IMAGELINK TEXT, BODY TEXT, FAVORITES TEXT, SMALLIMAGE BLOB)";

0 Stimmen

NSString* sqlFormat = @"INSERT INTO ARTICLES (favorites, smallImage) VALUES ('%@', ?)"; WAS MUSS ICH ANSTELLE VON "?" VERWENDEN %d oder %f oder was ???

0 Stimmen

HI, Könnten Sie mir bitte sagen, wo wir den Haupt-URL-String finden?

16voto

Viktor Apoyan Punkte 10497

Hier erfahren Sie, wie Sie ein Bild in SQLITE speichern können:

// Erstellen Sie die Images-Tabelle.
sql_stmp = "CREATE TABLE IF NOT EXISTS IMAGES (URL TEXT UNIQUE, IMAGE BLOB)";
if( sqlite3_exec(articlesDB, sql_stmp, NULL, NULL, &errMsg) != SQLITE_OK )
    NSLog( @"Fehler beim Erstellen der Tabelle \"IMAGES\". Fehler: %@", errMsg );

Und hier ist die Funktion zum Speichern:

// Speichern von kleinen Bilddaten anhand der Haupt-URL
- (void) SaveImagesToSql: (NSData*) imgData :(NSString*) mainUrl
{
    NSLog( @"\n***** Bild in SQLite speichern *****\n" );

    const char* sqliteQuery = "INSERT INTO IMAGES (URL, IMAGE) VALUES (?, ?)";
    sqlite3_stmt* statement;

    if( sqlite3_prepare_v2(articlesDB, sqliteQuery, -1, &statement, NULL) == SQLITE_OK )
    {
        sqlite3_bind_text(statement, 1, [mainUrl UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_blob(statement, 2, [imgData bytes], [imgData length], SQLITE_TRANSIENT);
        sqlite3_step(statement);
    }
    else NSLog( @"SaveBody: Fehlgeschlagen bei sqlite3_prepare_v2. Fehler: %s", sqlite3_errmsg(articlesDB) );

    // Datenbank abschließen und schließen.
    sqlite3_finalize(statement);
}

Und hier ist die Funktion zum Laden von Bildern:

// Bilder aus der Datenbank mit der angegebenen Bild-URL laden
- (NSData*) LoadImagesFromSql: (NSString*) imageLink
{
    NSData* data = nil;
    NSString* sqliteQuery = [NSString stringWithFormat:@"SELECT IMAGE FROM IMAGES WHERE URL = '%@'", imageLink];    
    sqlite3_stmt* statement;

    if( sqlite3_prepare_v2(articlesDB, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK )
    {
        if( sqlite3_step(statement) == SQLITE_ROW )
        {
            int length = sqlite3_column_bytes(statement, 0);
            data       = [NSData dataWithBytes:sqlite3_column_blob(statement, 0) length:length];
        }
    }

    // Datenbank abschließen und schließen.
    sqlite3_finalize(statement);

    return data;

}

1 Stimmen

Wie erhalten wir die Haupt-URL?

3voto

Viktor Apoyan Punkte 10497

Oder wie kann ich Blob-Daten aktualisieren ??

NSString* sqliteQuery = [NSString stringWithFormat:@"UPDATE ARTICLES SET SMALLIMAGE = '?' WHERE IMAGELINK = '@%'", mainUrl];

Funktion ist:

if (sqlite3_open([self.dataBasePath UTF8String], &articlesDB) == SQLITE_OK) 
        {
            NSString* sqliteQuery = [NSString stringWithFormat:@"UPDATE ARTICLES SET SMALLIMAGE = '?' WHERE IMAGELINK = '@%'", mainUrl];    
            sqlite3_stmt* statement;

            if( sqlite3_prepare_v2(articlesDB, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK ) 
            {
                int result = sqlite3_bind_blob(statement, 9, [imgData bytes], [imgData length], NULL);
                sqlite3_step(statement);
            }
            else
            {
                NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(articlesDB) );
            }

            // Finalize and close database.
            sqlite3_finalize(statement);
            sqlite3_close(articlesDB);
        }
        else 
        {
            NSLog(@"SaveSmallImage: Failed from sqlite3_open. Error is: %s", sqlite3_errmsg(articlesDB) );
        }

dieser Teil des Codes gibt Fehler 25 zurück

int result = sqlite3_bind_blob(statement, 9, [imgData bytes], [imgData length], NULL);

0 Stimmen

@ViToBrothers Ich habe deinen oben genannten Code verwendet, aber ich konnte mein Blob-Feld nicht aktualisieren?

0voto

Fabri Alexandre Punkte 11

Um das BLOB-Bild zu aktualisieren: (bearbeitet und einige Tippfehler aus der unten stehenden Aktualisierungsantwort korrigiert)

-(void) UpdateImagesToSql: (NSData *)imgData forUrl: (NSString *) mainUrl {

    NSLog( @"\n*****Bild in SQLite aktualisieren*****\n",);

    const char* sqliteQuery =  NSString* sqliteQuery = [NSString stringWithFormat:@"UPDATE ARTICLES SET SMALLIMAGE = ? WHERE IMAGELINK = '@%'", mainUrl]; 

    sqlite3_stmt* statement;

    if( sqlite3_prepare_v2(articlesDB, sqliteQuery, -1, &statement, NULL) == SQLITE_OK )
    {
        sqlite3_bind_blob(statement, 1, [imgData bytes], (int)[imgData length], SQLITE_TRANSIENT);
        sqlite3_step(statement);
    }
    else
    {
        NSLog( @"SaveBody: Fehler beim sqlite3_prepare_v2. Fehlermeldung:  %s", sqlite3_errmsg(articlesDB) );
    }

    // Datenbank abschließen und schließen.

    sqlite3_finalize(statement);
}

0 Stimmen

Hallo, könnten Sie mir bitte sagen, wo wir die Haupt-URL bekommen?

0 Stimmen

Oder die URI des Fotoalbums?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X