0Pricing
Objective-C iOS Development for Legacy & Enterprise Apps · Leçon

Intégration de SQLite avec FMDB

Intégrez des bases de données SQLite à vos applications Objective-C avec le wrapper populaire FMDB pour manipuler directement les données.

Intégration de SQLite avec FMDB est une leçon Objective-C iOS Development for Legacy & Enterprise Apps gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Objective-C iOS Development for Legacy & Enterprise Apps, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Objective-C iOS Development for Legacy & Enterprise Apps comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

SQLite & FMDB: An Introduction

Welcome! In this lesson, we'll explore integrating SQLite, a popular lightweight database, directly into your Objective-C applications. SQLite is embedded directly within your app, perfect for local data storage.

To make working with SQLite easier in Objective-C, we'll use FMDB, a powerful and user-friendly wrapper. It simplifies common database tasks.

Why Choose FMDB?

While you can use SQLite's C API directly, FMDB offers several advantages:

  • Object-Oriented: It provides Objective-C classes for database, result sets, and statements.
  • Simplified API: Easier to write and read than raw C code.
  • Parameter Binding: Safely handles arguments, preventing SQL injection.
  • Thread Safety: Includes FMDatabaseQueue for safe multi-threaded access.

Setting Up FMDB

To use FMDB in your project, the easiest way is via CocoaPods. Add pod 'FMDB' to your Podfile and run pod install. After installation, remember to #import "FMDB.h" in your Objective-C files.

Alternatively, you can manually drag the FMDB source files into your project.

Opening Your Database

First, you need to create or open a database file. FMDB's FMDatabase class makes this straightforward. If the file doesn't exist, it will be created.

Try running this example to open a 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;
}

Creating a Table

Once the database is open, you can execute SQL commands like CREATE TABLE using executeUpdate:. This method is used for any SQL that doesn't return a result set (e.g., INSERT, UPDATE, DELETE).

Run this code to create a 'users' table:

#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;
}

Inserting Data

To add data to your table, use executeUpdate: again. FMDB is great at handling parameters, preventing SQL injection. Use ? as placeholders for your values.

See how we insert two users:

#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;
}

Querying Data

To retrieve data, use executeQuery:. This returns an FMResultSet object, which you can iterate through to get your results. Each row's columns can be accessed by name or index.

Let's fetch the users we just added:

#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;
}

Updating and Deleting Data

Modifying or removing records also uses executeUpdate:. Just provide the appropriate SQL UPDATE or DELETE statements, again using ? for parameters.

This example updates 'Charlie's age and then deletes '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;
}

Using Transactions for Reliability

For sequences of database operations that must all succeed or all fail, use transactions. FMDB provides beginTransaction, commit, and rollback methods to ensure data integrity.

If any operation within the transaction fails, you can roll back to the state before the transaction began.

#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;
}

Check Your Understanding

Which of the following statements about using FMDB for SQLite in Objective-C are true?

Recap: SQLite & FMDB

Great job! You've learned how to integrate SQLite databases into your Objective-C apps using the FMDB wrapper.

  • SQLite is a lightweight, embedded database.
  • FMDB simplifies SQLite operations with an Objective-C API.
  • You can open databases, create tables, and perform CRUD (Create, Read, Update, Delete) operations.
  • Always use parameterized queries for safety and consider transactions for reliability.

This knowledge is crucial for managing local data storage in your legacy Objective-C applications!

Questions Fréquemment Posées

La leçon « Intégration de SQLite avec FMDB » est-elle gratuite ?

Oui — le texte complet de « Intégration de SQLite avec FMDB » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Objective-C iOS Development for Legacy & Enterprise Apps, passe à CoddyKit PRO. Le cours Objective-C iOS Development for Legacy & Enterprise Apps comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Intégration de SQLite avec FMDB » ?

Intégrez des bases de données SQLite à vos applications Objective-C avec le wrapper populaire FMDB pour manipuler directement les données. Tu pratiques Objective-C iOS Development for Legacy & Enterprise Apps avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Objective-C iOS Development for Legacy & Enterprise Apps ?

Aucune expérience préalable n'est requise. Objective-C iOS Development for Legacy & Enterprise Apps sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Intégration de SQLite avec FMDB » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Objective-C iOS Development for Legacy & Enterprise Apps ?

Oui. Chaque leçon Objective-C iOS Development for Legacy & Enterprise Apps inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Listes de propriétés et archivage
  2. Bases de Core Data
  3. Intégration de SQLite avec FMDB
  4. Enregistrer les préférences avec NSUserDefaults
← Retour à Objective-C iOS Development for Legacy & Enterprise Apps