cocoa - Core Data vs SQLite 3





macos core-data sqlite3 (5)


ومع iOS 5.0 ، ستحصل على ميزة إضافية تتمثل في القدرة على استخدام iCloud file-sync مجانًا إذا كنت تستخدم Core Data. إذا كنت تستخدم SQLite مباشرة ، يجب أن يكون هناك الكثير من الترقيع اليدوي والتنفيذ للحصول على مزامنة عبر iCloud.

أنا بالفعل على دراية بقواعد البيانات العلائقية واستخدمت SQLite (وقواعد البيانات الأخرى) في الماضي. ومع ذلك ، فإن البيانات الأساسية لديها جاذبية معينة ، لذلك أفكر في قضاء بعض الوقت في تعلمها لاستخدامها في طلبي المقبل.

هل هناك فائدة كبيرة لاستخدام البيانات الأساسية على SQLite ، أو العكس؟ ما هي إيجابيات وسلبيات كل منها؟

أجد صعوبة في تبرير تكلفة تعلم Core Data عندما لا تستخدمها Apple للعديد من تطبيقاتها الرئيسية مثل Mail.app أو iPhoto.app - بدلاً من ذلك اختيار قواعد بيانات SQLite. يستخدم SQLite أيضا على نطاق واسع على iPhone.

هل يستطيع هؤلاء الذين اعتادوا استخدام التعليقين على تجربتهم؟ ربما ، كما هو الحال مع معظم الأشياء ، فإن السؤال أعمق من مجرد استخدام واحد على الآخر؟




على الرغم من أن Core Data عبارة عن سليل لإطار عمل Enterprise لمؤسسة Apple ، إلا أن المخطط المعياري للكائن (ORM) الذي كان مرتبطًا ارتباطًا وثيقًا بالواجهة العلائقية ، فإن البيانات الأساسية ليست ORM. هو ، في الواقع ، إطار إدارة الرسم البياني الكائن. فهي تدير رسمًا بيانيًا كبيرًا جدًا لمثيلات الكائن ، مما يسمح للتطبيق بالعمل مع رسم بياني لا يتناسب تمامًا مع الذاكرة عن طريق التصدع في الكائنات داخل وخارج الذاكرة عند الضرورة. كما تقوم Core Data أيضًا بإدارة القيود على الخصائص والعلاقات والحفاظ على سلامة المرجع (على سبيل المثال الحفاظ على الروابط الأمامية والخلفية المتسقة عند إضافة / إزالة الكائنات إلى / من العلاقة). وبذلك تكون البيانات الأساسية هي الإطار المثالي لبناء المكون "النموذجي" في معمارية MVC.

لتنفيذ إدارة الرسم البياني ، يحدث البيانات الأساسية لاستخدام SQLite كمخزن القرص. كان يمكن أن يتم تنفيذها باستخدام قاعدة بيانات علائقية مختلفة أو حتى قاعدة بيانات غير ذات علاقة مثل CouchDB . كما أشار آخرون ، يمكن للبيانات الأساسية أيضًا استخدام XML أو تنسيق ثنائي أو تنسيق ذري مكتوب بواسطة المستخدم كخلفية (على الرغم من أن هذه الخيارات تتطلب أن يتم احتواء الرسم البياني الكائن بأكمله في الذاكرة). إذا كنت مهتمًا بكيفية تنفيذ Core Data على واجهة SQLite ، قد ترغب في التحقق من OmniDataObjects في OmniDataObjects ، وهو تنفيذ مفتوح المصدر لمجموعة فرعية من Core Data API. إطار BaseTen هو أيضًا تنفيذ لواجهة برمجة التطبيقات الأساسية للبيانات باستخدام PostgreSQL كخلفية.

نظرًا لأن البيانات الأساسية غير مخصصة لتكون ORM لـ SQLite ، فلا يمكنها قراءة مخطط SQLite العشوائي. وبالعكس ، يجب ألا تعتمد على القدرة على قراءة مخازن البيانات SQLite Core Data مع أدوات SQLite الأخرى؛ المخطط عبارة عن تفاصيل تنفيذ قد تتغير.

وبالتالي ، ليس هناك أي تعارض بين استخدام Core Data أو SQLite مباشرة. إذا كنت تريد قاعدة بيانات علائقية ، استخدم SQLite (مباشرة أو عبر أحد أغلفة Objective-C مثل FMDB ) أو خادم قاعدة بيانات علائقية. ومع ذلك ، قد لا تزال ترغب في تعلم البيانات الأساسية لاستخدامها كإطار عمل إدارة الرسم البياني الكائن. في تركيبة مع فئات وحدة تحكم Apple وواجهات عرض متوافقة متوافقة مع مفاتيح القيمة ، يمكنك تنفيذ بنية MVC كاملة مع رمز صغير جدًا .




يعد SQLite أحد تنسيقات قاعدة البيانات للبيانات الأساسية. باستخدام Core Data ، يمكنك تحقيق تكامل أفضل مع بقية واجهة برمجة تطبيقات Cocoa.




البيانات الأساسية ليست محرك قاعدة بيانات بقدر ما هي واجهة برمجة تطبيقات تلخص في مخزن البيانات الفعلي. يمكنك معرفة بيانات Core لحفظها كقاعدة بيانات sqlite ، أو plist ، أو ملف ثنائي ، أو حتى نوع مخزن بيانات مخصص.

أود أن أوصي تعلم البيانات الأساسية ، كما هو مورد ممتاز أن يسرع كثيرا أجزاء كثيرة من تطوير تطبيقات الكاكاو.




هذه مشكلة شائعة تتعلق بالقرص الإدخال / الإخراج و GCD. بشكل أساسي ، من المحتمل أن يكون GCD ينتج موضوعًا واحدًا لكل ملف ، وعند نقطة معينة ، يكون لديك عدد كبير جدًا من سلاسل الرسائل حتى يتمكن النظام من الخدمة في فترة زمنية معقولة.

في كل مرة تتصل فيها بـ dispatch_async () وفي تلك الكتلة ، تحاول أن تقوم بأي I / O (على سبيل المثال ، يبدو أنك تقرأ بعض الملفات هنا) ، فمن المحتمل أن يكون مؤشر الترابط الذي يتم تنفيذ كتلة الكود هذه فيه (يتم إيقافها مؤقتًا بواسطة نظام التشغيل) أثناء انتظار قراءة البيانات من نظام الملفات. الطريقة التي يعمل بها GCD هي أنه عندما يرى أن أحد سلاسل العمليات الخاصة به تم حظره على الإدخال / الإخراج وكنت لا تزال تطالبه بتنفيذ المزيد من العمل بشكل متزامن ، فسوف ينتج عنه مؤشر ترابط جديد فقط. وبالتالي ، إذا حاولت فتح 50 ملفًا في قائمة انتظار متزامنة ، فمن المحتمل أن ينتهي بك الأمر إلى جعل GCD تفرخ إلى 50 موضوعًا.

هذا عدد كبير جداً من مؤشرات الترابط للنظام لخدمة ذات معنى ، وينتهي بك الأمر تجويع مؤشر الترابط الرئيسي الخاص بك CPU.

طريقة إصلاح هذه المشكلة هي استخدام قائمة انتظار تسلسلية بدلاً من قائمة انتظار متزامنة لتنفيذ عملياتك المستندة إلى الملفات. من السهل القيام به. ستحتاج إلى إنشاء قائمة انتظار تسلسلية وتخزينها باعتبارها ivar في الكائن الخاص بك بحيث لا ينتهي بك الأمر إنشاء قوائم انتظار تسلسلية متعددة. لذا قم بإزالة هذه المكالمة:

dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

أضف هذا في طريقة init:

taskQ = dispatch_queue_create("com.yourcompany.yourMeaningfulLabel", DISPATCH_QUEUE_SERIAL);

أضف هذا في طريقة dealloc:

dispatch_release(taskQ);

وأضف هذا كـ ivar في تصريح صفك:

dispatch_queue_t taskQ;





cocoa macos sqlite core-data sqlite3