SQLite-integrasjon med FMDB
Integrer SQLite-databaser i Objective-C-appene dine ved hjelp av den populære FMDB-innpakningen for direkte datamanipulering.
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
FMDatabaseQueuefor 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!
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
- Property-lister og arkivering
- Grunnleggende om Core Data
- SQLite-integrasjon med FMDB
- Lagre innstillinger med NSUserDefaults