cocoa sqlite教學 - 核心數據與SQLite 3




sqlite3語法 sqlite3範例 (5)

我已經非常熟悉關係數據庫,並且過去曾經使用SQLite (和其他數據庫)。 但是, Core Data有一定的吸引力,因此我正在考慮花一些時間來學習它,以便在我的下一個應用程序中使用它。

通過SQLite使用Core Data有什麼好處,反之亦然? 每個的優點/缺點是什麼?

當Apple不將它用於許多旗艦應用程序(如Mail.app或iPhoto.app)時,我發現很難證明學習Core Data的成本 - 而是選擇SQLite數據庫。 SQLite也在iPhone上廣泛使用。

那些熟悉使用它們的人可以評論他們的經驗嗎? 也許和大多數事情一樣,這個問題比只使用一個更深層次的問題更深刻。


Answers

核心數據並不是一個數據庫引擎,因為它是抽像出實際數據存儲的API。 你可以告訴核心數據保存為sqlite數據庫,plist,二進製文件,甚至是自定義數據存儲類型。

我會推薦學習Core Data,因為它是一個極好的資源,可以大大加速可可應用程序開發的許多部分。


雖然核心數據是Apple的企業對象框架的後代,但是與關係後端緊密相關的對象關係映射器(ORM),核心數據並不是一個ORM。 事實上,它是一個對像圖管理框架。 它管理對象實例的潛在非常大的圖形,允許應用程序使用圖形進行工作,該圖形根據需要通過錯誤的對象進出內存而不完全適合內存。 核心數據還管理對屬性和關係的約束,並保持參考完整性(例如,在將對象添加到關係或從關係中移除時,保持前向和後向鏈接一致)。 核心數據因此是構建MVC體系結構的“模型”組件的理想框架。

為了實現圖形管理,Core Data 恰好使用SQLite作為磁盤存儲。 它可以使用不同的關係數據庫甚至非關係數據庫(如CouchDB 。 正如其他人指出的那樣,Core Data也可以使用XML或二進制格式或用戶編寫的原子格式作為後端(儘管這些選項要求整個對像圖都適合內存)。 如果您對核心數據如何在SQLite後端實現感興趣,您可能需要查看OmniGroup的OmniDataObjects框架,這是Core Data API子集的開源實現。 BaseTen框架也是使用PostgreSQL作為後端的Core Data API的實現。

由於Core Data不是SQLite的ORM,它不能讀取任意SQLite模式。 相反,您不應該依賴於能夠使用其他SQLite工具讀取Core Data的SQLite數據存儲; 模式是可能會改變的實現細節。

因此,直接使用Core Data或SQLite並沒有真正的衝突。 如果您想要關係數據庫,請使用SQLite(直接或通過諸如FMDB之類的Objective-C包裝器FMDB )或關係數據庫服務器。 但是,您仍然可能想要學習Core Data以用作對像圖管理框架。 結合Apple的控制器類和鍵值綁定兼容的視圖小部件,您可以用很少的代碼實現完整的MVC體系結構。


SQLite是Core Data的數據庫格式之一。 使用核心數據,您可以更好地與其餘的Cocoa API進行集成。


而在iOS 5.0中,如果您使用的是核心數據,您還可以免費使用iCloud文件同步功能。 如果您直接使用SQLite,則必須進行大量手動修補和實施才能使其跨越iCloud進行同步。


一種變化是使用SELECT COUNT(*)而不是SELECT NAME,即

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

這將返回0,如果表不存在,則返回1。 這對您的編程可能很有用,因為數值結果更快/更容易處理。 以下說明瞭如何在Android中使用帶參數的SQLiteDatabase,Cursor和rawQuery執行此操作。

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}




cocoa macos sqlite core-data sqlite3