Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper · leksjon

SQLite-integrasjon med FMDB

Integrer SQLite-databaser i Objective-C-appene dine ved hjelp av den populære FMDB-innpakningen for direkte datamanipulering.

Leksjon 3 av 411 trinn

SQLite-integrasjon med FMDB er en gratis leksjon i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.

SQLite og FMDB: En introduksjon

Velkommen! I denne leksjonen skal vi utforske integrering av SQLite, en populær og lettvektsdatabase, direkte i Objective-C-applikasjonene dine. SQLite er innebygd direkte i appen og egner seg godt for lokal datalagring.

For å gjøre det enklere å arbeide med SQLite i Objective-C bruker vi FMDB, en kraftig og brukervennlig wrapper. Den forenkler vanlige databaseoppgaver.

Hvorfor velge FMDB?

Selv om du kan bruke C-API-et til SQLite direkte, har FMDB flere fordeler:

  • Objektorientert: Det tilbyr Objective-C-klasser for databaser, resultatsett og instruksjoner.
  • Forenklet API: Det er enklere å skrive og lese enn rå C-kode.
  • Parameterbinding: Håndterer argumenter på en sikker måte og hindrer SQL-injeksjon.
  • Trådsikkerhet: Inkluderer FMDatabaseQueue for sikker tilgang fra flere tråder.

Konfigurere FMDB

Den enkleste måten å bruke FMDB i prosjektet på er via CocoaPods. Legg til pod 'FMDB' i Podfile-filen og kjør pod install. Etter installasjonen må du huske å ta med #import "FMDB.h" i Objective-C-filene dine.

Alternativt kan du dra FMDB-kildefilene manuelt inn i prosjektet.

Åpne databasen

Først må du opprette eller åpne en databasefil. FMDB-klassen FMDatabase gjør dette enkelt. Hvis filen ikke finnes, blir den opprettet.

Prøv å kjøre dette eksempelet for å åpne en database:

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    // Get the path to the app's Documents directory
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];

    // Create an FMDatabase object
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) {
      NSLog(@"Error: Could not open database.");
      // Always check for errors!
      return 1;
    }
    NSLog(@"Database opened successfully at: %@", dbPath);

    // Close the database when done
    [db close];
    NSLog(@"Database closed.");
  }
  return 0;
}

Opprette en tabell

Når databasen er åpen, kan du kjøre SQL-kommandoer som CREATE TABLE ved hjelp av executeUpdate:. Denne metoden brukes for SQL som ikke returnerer et resultatsett (for eksempel INSERT, UPDATE og DELETE).

Kjør denne koden for å opprette en «users»-tabell:

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) { NSLog(@"Error opening db."); return 1; }

    NSString *sql = @"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)";
    BOOL success = [db executeUpdate:sql];

    if (success) {
      NSLog(@"Table 'users' created or already exists.");
    } else {
      NSLog(@"Error creating table: %@", [db lastErrorMessage]);
    }
    [db close];
  }
  return 0;
}

Sette inn data

For å legge til data i tabellen bruker du executeUpdate: igjen. FMDB er godt egnet til å håndtere parametere og hindrer SQL-injeksjon. Bruk ? som plassholdere for verdiene dine.

Se hvordan vi setter inn to brukere:

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) { NSLog(@"Error opening db."); return 1; }
    [db executeUpdate:@"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"];

    BOOL success1 = [db executeUpdate:@"INSERT INTO users (name, age) VALUES (?, ?)", @"Alice", @25];
    BOOL success2 = [db executeUpdate:@"INSERT INTO users (name, age) VALUES (?, ?)", @"Bob", @30];

    if (success1 && success2) {
      NSLog(@"Users inserted successfully!");
    } else {
      NSLog(@"Error inserting users: %@", [db lastErrorMessage]);
    }
    [db close];
  }
  return 0;
}

Spørre etter data

For å hente data bruker du executeQuery:. Dette returnerer et FMResultSet-objekt som du kan gå gjennom for å hente resultatene. Kolonnene i hver rad kan nås med navn eller indeks.

La oss hente brukerne vi nettopp la til:

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) { NSLog(@"Error opening db."); return 1; }
    [db executeUpdate:@"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"];
    [db executeUpdate:@"INSERT INTO users (name, age) VALUES (?, ?)", @"Charlie", @28];

    FMResultSet *rs = [db executeQuery:@"SELECT id, name, age FROM users"];
    while ([rs next]) {
      int userId = [rs intForColumn:@"id"];
      NSString *name = [rs stringForColumn:@"name"];
      int age = [rs intForColumn:@"age"];
      NSLog(@"User ID: %d, Name: %@, Age: %d", userId, name, age);
    }
    [rs close]; // Always close the result set
    [db close];
  }
  return 0;
}

Oppdatere og slette data

Også for å endre eller fjerne oppføringer bruker du executeUpdate:. Bare oppgi de aktuelle SQL-setningene med UPDATE eller DELETE, og bruk igjen ? for parametere.

Dette eksempelet oppdaterer alderen til «Charlie» og sletter deretter «Bob»:

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) { NSLog(@"Error opening db."); return 1; }
    [db executeUpdate:@"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"];
    [db executeUpdate:@"INSERT INTO users (name, age) VALUES (?, ?)", @"Charlie", @28];
    [db executeUpdate:@"INSERT INTO users (name, age) VALUES (?, ?)", @"Bob", @30];

    // Update Charlie's age
    BOOL updateSuccess = [db executeUpdate:@"UPDATE users SET age = ? WHERE name = ?", @29, @"Charlie"];
    if (updateSuccess) { NSLog(@"Charlie's age updated."); }

    // Delete Bob
    BOOL deleteSuccess = [db executeUpdate:@"DELETE FROM users WHERE name = ?", @"Bob"];
    if (deleteSuccess) { NSLog(@"Bob deleted."); }

    [db close];
  }
  return 0;
}

Bruke transaksjoner for pålitelighet

For sekvenser av databaseoperasjoner som enten må lykkes i sin helhet eller mislykkes i sin helhet, bruker du transaksjoner. FMDB tilbyr metodene beginTransaction, commit og rollback for å sikre dataintegriteten.

Hvis en operasjon i transaksjonen mislykkes, kan du rulle tilbake til tilstanden før transaksjonen startet.

#import <Foundation/Foundation.h>
#import "FMDB.h"

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"myApp.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];

    if (![db open]) { NSLog(@"Error opening db."); return 1; }
    [db executeUpdate:@"CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT, price REAL)"];

    [db beginTransaction];
    BOOL success = YES;
    if (![db executeUpdate:@"INSERT INTO products (name, price) VALUES (?, ?)", @"Apple", @1.0]) {
        success = NO;
    }
    // Simulate a failure by trying to insert a bad value (e.g., duplicate PK if not autoinc)
    // For this example, let's just make the second insert conditional
    if (success && ![db executeUpdate:@"INSERT INTO products (name, price) VALUES (?, ?)", @"Orange", @1.5]) {
        success = NO;
    }

    if (success) {
        [db commit];
        NSLog(@"Transaction committed: products inserted.");
    } else {
        [db rollback];
        NSLog(@"Transaction rolled back due to error: %@", [db lastErrorMessage]);
    }
    [db close];
  }
  return 0;
}

Test forståelsen din

Hvilke av følgende påstander om bruk av FMDB for SQLite i Objective-C er riktige?

Oppsummering: SQLite og FMDB

Godt jobbet! Du har lært hvordan du integrerer SQLite-databaser i Objective-C-appene dine ved hjelp av FMDB-wrapperen.

  • SQLite er en lettvekts, innebygd database.
  • FMDB forenkler SQLite-operasjoner med et Objective-C-API.
  • Du kan åpne databaser, opprette tabeller og utføre CRUD-operasjoner (Create, Read, Update, Delete).
  • Bruk alltid parameteriserte spørringer av sikkerhetshensyn, og vurder transaksjoner for bedre pålitelighet.

Dette er viktig kunnskap for å håndtere lokal datalagring i eldre Objective-C-applikasjoner!

Gratis å komme i gang

Lær deg Objective-C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «SQLite-integrasjon med FMDB» gratis?

Ja – hele teksten i «SQLite-integrasjon med FMDB» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.

Hva lærer jeg i «SQLite-integrasjon med FMDB»?

Integrer SQLite-databaser i Objective-C-appene dine ved hjelp av den populære FMDB-innpakningen for direkte datamanipulering. Du øver på Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper?

Ingen tidligere erfaring er nødvendig. Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «SQLite-integrasjon med FMDB»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjonen?

Ja. Alle Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Property-lister og arkivering
  2. Grunnleggende om Core Data
  3. SQLite-integrasjon med FMDB
  4. Lagre innstillinger med NSUserDefaults
← Tilbake til Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper