MST

星途 面试题库

面试题:SQLite在iOS开发中如何创建带外键约束的表

请描述在iOS开发环境下,使用SQLite创建一张包含外键约束的表的步骤和代码示例,假设需要创建一张学生表(students),关联班级表(classes),学生表中有班级ID作为外键指向班级表的主键ID。
23.4万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试
  1. 步骤

    • 导入SQLite框架:在iOS项目中,首先要确保导入了SQLite相关的框架,在Objective - C项目中可以通过#import <sqlite3.h>导入,在Swift项目中可以通过桥接文件导入。
    • 打开数据库:使用sqlite3_open函数打开SQLite数据库文件,如果文件不存在则会创建。
    • 编写创建表的SQL语句:在SQL语句中定义学生表的字段,并且使用FOREIGN KEY关键字来设置外键约束,关联班级表。
    • 执行SQL语句:使用sqlite3_exec或相关的函数执行创建表的SQL语句。
    • 关闭数据库:使用sqlite3_close函数关闭数据库连接。
  2. Objective - C代码示例

#import <sqlite3.h>
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        sqlite3 *db;
        const char *databasePath = "/Users/yourusername/yourdatabase.db";
        if (sqlite3_open(databasePath, &db) == SQLITE_OK) {
            const char *createTableSQL = "CREATE TABLE IF NOT EXISTS classes (id INTEGER PRIMARY KEY AUTOINCREMENT, class_name TEXT);";
            sqlite3_exec(db, createTableSQL, NULL, NULL, NULL);
            const char *createStudentTableSQL = "CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY AUTOINCREMENT, student_name TEXT, class_id INTEGER, FOREIGN KEY(class_id) REFERENCES classes(id));";
            sqlite3_exec(db, createStudentTableSQL, NULL, NULL, NULL);
            sqlite3_close(db);
        } else {
            NSLog(@"Failed to open database");
        }
    }
    return 0;
}
  1. Swift代码示例
import Foundation
import SQLite3

let databasePath = "/Users/yourusername/yourdatabase.db"
var db: OpaquePointer? = nil
if sqlite3_open(databasePath, &db) == SQLITE_OK {
    let createClassesTableSQL = "CREATE TABLE IF NOT EXISTS classes (id INTEGER PRIMARY KEY AUTOINCREMENT, class_name TEXT);"
    var createTableStatement: OpaquePointer? = nil
    if sqlite3_prepare_v2(db, createClassesTableSQL, -1, &createTableStatement, nil) == SQLITE_OK {
        if sqlite3_step(createTableStatement) != SQLITE_DONE {
            print("Failed to create classes table")
        }
    }
    sqlite3_finalize(createTableStatement)
    let createStudentTableSQL = "CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY AUTOINCREMENT, student_name TEXT, class_id INTEGER, FOREIGN KEY(class_id) REFERENCES classes(id));";
    if sqlite3_prepare_v2(db, createStudentTableSQL, -1, &createTableStatement, nil) == SQLITE_OK {
        if sqlite3_step(createTableStatement) != SQLITE_DONE {
            print("Failed to create students table")
        }
    }
    sqlite3_finalize(createTableStatement)
    sqlite3_close(db)
} else {
    print("Failed to open database")
}

在实际iOS开发中,路径应该是应用程序沙盒内的路径,这里为了示例简单使用了自定义路径。同时,SQLite外键约束默认是关闭的,在创建表之前需要开启外键约束,Objective - C中可以在打开数据库后执行PRAGMA foreign_keys = ON;,Swift中类似,如下:

  • Objective - C开启外键约束
if (sqlite3_open(databasePath, &db) == SQLITE_OK) {
    const char *pragmaSQL = "PRAGMA foreign_keys = ON;";
    sqlite3_exec(db, pragmaSQL, NULL, NULL, NULL);
    // 创建表的代码
}
  • Swift开启外键约束
if sqlite3_open(databasePath, &db) == SQLITE_OK {
    let pragmaSQL = "PRAGMA foreign_keys = ON;"
    var pragmaStatement: OpaquePointer? = nil
    if sqlite3_prepare_v2(db, pragmaSQL, -1, &pragmaStatement, nil) == SQLITE_OK {
        if sqlite3_step(pragmaStatement) != SQLITE_DONE {
            print("Failed to enable foreign keys")
        }
    }
    sqlite3_finalize(pragmaStatement)
    // 创建表的代码
}