首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS SQLite 打開數據庫報 Out of Memory 錯誤的根因:路徑傳遞缺少 UTF8String 轉換

     編輯:程式設計綜合問答

錯誤代碼


if (sqlite3_open_v2("SoundLib", &dbConnection, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
    // 報錯:out of memory(實為路徑無效導致無法分配頁面緩存)
}

直接傳遞字串 "SoundLib" 而非完整路徑的 UTF8String,SQLite 嘗試在當前工作目錄創建/打開文件,失敗後返回誤導性錯誤碼。

修正:使用完整路徑並轉 UTF8String


// 1. 獲取 Documents 目錄下的完整路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths firstObject];
NSString *dbPath = [docDir stringByAppendingPathComponent:@"SoundLib_DB.sqlite"];

// 2. 檢查/複製種子數據庫(同原代碼)
// ...

// 3. 正確打開:路徑轉 UTF8String
sqlite3 *db = nil;
int rc = sqlite3_open([dbPath UTF8String], &db); // 或 sqlite3_open_v2
if (rc != SQLITE_OK) {
    NSLog(@"SQLite open failed: %s", sqlite3_errmsg(db));
    sqlite3_close(db);
    return nil;
}
database = db;

關鍵點

  1. 必須用完整絕對路徑:相對路徑依賴進程工作目錄,不可靠。
  2. 必須轉 UTF8String:SQLite C API 接受 const char*,NSString 需轉換編碼。
  3. 錯誤碼誤導:路徑無效時 SQLite 可能返回 SQLITE_NOMEM (out of memory) 而非 SQLITE_CANTOPEN,因為嘗試分配頁面緩存失敗。

現代封裝:FMDB / GRDB


// FMDB 示例
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
[queue inDatabase:^(FMDatabase *db) {
    FMResultSet *rs = [db executeQuery:@"SELECT * FROM table"];
    while ([rs next]) { ... }
}];
// 自動處理路徑、編碼、線程安全、事務

Swift 版本 (GRDB)


let dbPath = try FileManager.default
    .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    .appendingPathComponent("SoundLib_DB.sqlite")
    .path

let dbQueue = try DatabaseQueue(path: dbPath)
try dbQueue.read { db in
    let rows = try Row.fetchCursor(db, sql: "SELECT * FROM table")
    while let row = try rows.next() { ... }
}

總結

iOS SQLite out of memory 多為**路徑錯誤/未轉 UTF8String**導致的誤導性錯誤。正確做法:sqlite3_open([fullPath UTF8String], &db)。強烈建議使用 FMDB/GRDB 等封裝庫,避免底層 C API 陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved