面试题答案
一键面试SQLite主要数据类型
- NULL:表示一个空值。
- INTEGER:带符号的整数,根据数值大小存储为1、2、3、4、6或8字节。
- REAL:浮点值,存储为8字节的IEEE浮点数。
- TEXT:文本字符串,使用数据库编码(UTF - 8、UTF - 16BE或UTF - 16LE)存储。
- BLOB:二进制大对象,以输入的数据格式存储。
从数据库读取数据转换为Objective - C或Swift数据类型注意问题及举例
- Objective - C
- INTEGER类型:SQLite的INTEGER类型在Objective - C中可转换为
NSNumber
。例如,从数据库读取INTEGER值:
- INTEGER类型:SQLite的INTEGER类型在Objective - C中可转换为
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中可转换为
Int
或NSNumber
(如果需要使用Cocoa框架相关功能)。例如:
- INTEGER类型:在Swift中可转换为
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类型:转换为
Double
或NSNumber
。示例:
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调用返回的错误情况。