MST

星途 面试题库

面试题:SQLite在iOS开发中的数据类型及转换

在iOS的SQLite开发中,SQLite支持哪些主要的数据类型?当从数据库中读取数据并转换为Objective - C或Swift的数据类型时,需要注意哪些问题?请举例说明。
12.1万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

SQLite主要数据类型

  1. NULL:表示一个空值。
  2. INTEGER:带符号的整数,根据数值大小存储为1、2、3、4、6或8字节。
  3. REAL:浮点值,存储为8字节的IEEE浮点数。
  4. TEXT:文本字符串,使用数据库编码(UTF - 8、UTF - 16BE或UTF - 16LE)存储。
  5. BLOB:二进制大对象,以输入的数据格式存储。

从数据库读取数据转换为Objective - C或Swift数据类型注意问题及举例

  • Objective - C
    • INTEGER类型:SQLite的INTEGER类型在Objective - C中可转换为NSNumber。例如,从数据库读取INTEGER值:
sqlite3_stmt *stmt;
const char *sql = "SELECT id FROM users WHERE name =?";
if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, "John", -1, SQLITE_TRANSIENT);
    if (sqlite3_step(stmt) == SQLITE_ROW) {
        int idValue = sqlite3_column_int(stmt, 0);
        NSNumber *number = [NSNumber numberWithInt:idValue];
    }
    sqlite3_finalize(stmt);
}
  • TEXT类型:TEXT类型转换为NSString。如:
sqlite3_stmt *stmt;
const char *sql = "SELECT name FROM users WHERE id =?";
if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK) {
    sqlite3_bind_int(stmt, 1, 1);
    if (sqlite3_step(stmt) == SQLITE_ROW) {
        const unsigned char *nameChars = sqlite3_column_text(stmt, 0);
        NSString *name = [NSString stringWithUTF8String:(const char *)nameChars];
    }
    sqlite3_finalize(stmt);
}
  • REAL类型:转换为NSNumber。示例:
sqlite3_stmt *stmt;
const char *sql = "SELECT price FROM products WHERE product_id =?";
if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK) {
    sqlite3_bind_int(stmt, 1, 100);
    if (sqlite3_step(stmt) == SQLITE_ROW) {
        double priceValue = sqlite3_column_double(stmt, 0);
        NSNumber *priceNumber = [NSNumber numberWithDouble:priceValue];
    }
    sqlite3_finalize(stmt);
}
  • Swift
    • INTEGER类型:在Swift中可转换为IntNSNumber(如果需要使用Cocoa框架相关功能)。例如:
let sql = "SELECT id FROM users WHERE name =?"
var stmt: OpaquePointer?
if sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK {
    sqlite3_bind_text(stmt, 1, "John", -1, nil)
    if sqlite3_step(stmt) == SQLITE_ROW {
        let idValue = sqlite3_column_int(stmt, 0)
        let id = Int(idValue)
    }
    sqlite3_finalize(stmt)
}
  • TEXT类型:转换为String。如:
let sql = "SELECT name FROM users WHERE id =?"
var stmt: OpaquePointer?
if sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK {
    sqlite3_bind_int(stmt, 1, 1)
    if sqlite3_step(stmt) == SQLITE_ROW {
        if let nameChars = sqlite3_column_text(stmt, 0) {
            let name = String(cString: nameChars)
        }
    }
    sqlite3_finalize(stmt)
}
  • REAL类型:转换为DoubleNSNumber。示例:
let sql = "SELECT price FROM products WHERE product_id =?"
var stmt: OpaquePointer?
if sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK {
    sqlite3_bind_int(stmt, 1, 100)
    if sqlite3_step(stmt) == SQLITE_ROW {
        let priceValue = sqlite3_column_double(stmt, 0)
        let price = priceValue
    }
    sqlite3_finalize(stmt)
}

注意:在转换数据类型时,要确保数据库中数据的实际类型与转换目标类型兼容,避免数据丢失或类型转换错误。同时,要妥善处理SQLite API调用返回的错误情况。