Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Advanced Core Data
Search
Sing Jie Lee
November 20, 2015
Technology
48
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Advanced Core Data
Sing Jie Lee
November 20, 2015
More Decks by Sing Jie Lee
See All by Sing Jie Lee
Infocomm Media Youth Festival 2016 - Career Talk
singjie
0
62
Sprite Kit
singjie
0
66
SiriKit
singjie
0
210
React Native
singjie
1
100
Arduino
singjie
0
48
Software Engineering
singjie
0
63
Amazon Echo and Home Integration
singjie
0
120
CS3216 Garena Project X
singjie
0
59
Life
singjie
0
47
Other Decks in Technology
See All in Technology
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
260
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
夫婦で子育てするための育児標準化
codmoninc
PRO
0
340
Optunaの最新リリースv5.0について
pfn
PRO
0
120
Browser Spec: Testing Hotwire with Ruby
takahashim
1
120
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
4
1.1k
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
190
Metadata - Section 1: HTML Basics
mohab1
0
120
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
150
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
6k
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
600
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
The Limits of Empathy - UXLibs8
cassininazir
2
720
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
370
Optimizing for Happiness
mojombo
378
71k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
The agentic SEO stack - context over prompts
schlessera
0
970
Transcript
CORE DATA LEE SING JIE
ARDUINO…
UNDERSTANDING CORE DATA IN DEPTH
UNDERSTANDING CORE DATA IN DEPTH
GUI BROWSER
COMMAND LINE BROWSER $ sqlite3 /Users/singjie/present/ main-25142226 SQLite version 3.8.5
2014-08-15 22:37:57 Enter ".help" for usage hints. sqlite>
Z_METADATA
Z_METADATA - PLIST
Z_PRIMARYKEY
Z_ENT
SUBCLASSING SHOULD YOU?
SUBCLASSING
SUBCLASSING
SUBCLASSING - Z_PRIMARYKEY
SUBCLASSING - Z_ENT
SUBCLASSING - Z_ENT
SUBCLASSING - WHAT IS INDEXING?
CHECKING ON QUERY’S EFFICIENCY
sqlite> explain query plan select * from ZBTMessage where ZMSGID
= 2; 0|0|0|SEARCH TABLE ZBTMessage USING INDEX ZBTMESSAGE_ZMSGID_INDEX (ZMSGID=?) USING EXPLAIN QUERY PLAN
sqlite> explain query plan select * from ZBTMessage where ZMSGID
= 2; 0|0|0|SEARCH TABLE ZBTMessage USING INDEX ZBTMESSAGE_ZMSGID_INDEX (ZMSGID=?) USING EXPLAIN QUERY PLAN
sqlite> explain query plan select * from ZBTInvite where ZINVITEID
= 2; 0|0|0|SCAN TABLE ZBTInvite USING EXPLAIN QUERY PLAN
SUBCLASSING - Z_ENT ZBTBuzzClub - 50k rows (Z_ENT == 16)
ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows Indexes: ‣ Z_ENT ‣ Z_BUZZ_ID sqlite will always use Z_ENT index SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT Indexes: ‣ Z_ENT ‣ Z_BUZZ_ID sqlite> explain
query plan select * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123; 0|0|0|SEARCH TABLE ZBTBuzz USING INDEX ZBTBuzz_Z_ENT_INDEX (Z_ENT=?) SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT INDEX ZBTBuzzClub - 50k rows (Z_ENT ==
16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 50k rows (Z_ENT == 16) ZBTBuzzClub - 1 row (Z_BUZZ_ID = 123) 1 2 3 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_BUZZ_ID INDEX ZBTBuzzClub - 50k rows (Z_ENT ==
16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 2 rows (Z_BUZZ_ID == 123) ZBTBuzzClub - 1 row (Z_ENT == 16) 1 2 3 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT, Z_BUZZ_ID COMPOUND INDEX ZBTBuzzClub - 50k rows
(Z_ENT == 16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 1 row (Z_ENT == 16 && Z_BUZZ_ID == 123) 1 2 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT, Z_BUZZ_ID COMPOUND INDEX ZBTBuzzClub - 50k rows
(Z_ENT == 16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 1 row (Z_ENT == 16 && Z_BUZZ_ID == 123) 1 2 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
HOW TO FIX?
SUBCLASSING ZBTBuzzClub - 50k rows (Z_ENT == 16) ZBTBuzzUser -
50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 2 rows (Z_BUZZ_ID == 123) 1 2 for (id result in results) { if ([result isKindOfClass:[BTBuzzClub class]]) { … } } SELECT * from ZBTBuzz where Z_BUZZ_ID = 123;
IN SHORT, DON’T SUBCLASS!
MANAGE TYPES YOURSELF ZBTBuzz(Club) - 50k rows (Z_TYPE == BUZZCLUB)
ZBTBuzz(User) - 50k rows (Z_TYPE == BUZZUSER) ZBTBuzz - ~100k rows select * from ZBTBuzz where Z_TYPE = BUZZCLUB AND Z_BUZZ_ID = 123; Compound: ‣ Z_TYPE, Z_BUZZ_ID
PROFILING ON THE FLY
PROFILING ▸ -com.apple.CoreData.SQLDebug 1
PROFILING 2015-11-20 10:09:48.593 BeeTalk[3579:1652444] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT,
t0.ZDATA, t0.ZDISPLAYINDEX, t0.ZISOUTGOING, t0.ZISWHISPER, t0.ZMEDIASTATUS, t0.ZMSGID, t0.ZREADCOUNT, t0.ZSTATUS, t0.ZTIMESTAMP, t0.ZTYPE, t0.ZWHISPERDURATION, t0.ZWHISPERSTARTTIME, t0.ZBUDDYINFO, t0.ZCHAT, t0.Z5_CHAT, t0.ZINVCHAT, t0.Z5_INVCHAT, t0.ZLASTREADCHAT, t0.Z5_LASTREADCHAT, t0.ZUSER FROM ZBTMESSAGE t0 WHERE (( t0.ZMEDIASTATUS = ? OR t0.ZMEDIASTATUS = ?) AND t0.ZTYPE = ?) 2015-11-20 10:09:48.594 BeeTalk[3579:1652444] CoreData: annotation: sql connection fetch time: 0.0002s
PROFILING + (void)load { #if defined DEBUG || defined INTRELEASE
Method original, swizzled; original = class_getInstanceMethod(self, @selector(executeFetchRequest:error:)); swizzled = class_getInstanceMethod(self, @selector(executeFetchRequest_Swizzled:error:)); method_exchangeImplementations(original, swizzled); #endif } - (NSArray *)executeFetchRequest_Swizzled:(NSFetchRequest *)request error:(NSError *__autoreleasing *)error { NSString *logFormat = [NSString stringWithFormat:@"[%@]: %@", request.entityName, request.predicate.tracerPredicate]; CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); NSArray *results = [self executeFetchRequest_Swizzled:request error:error]; CFAbsoluteTime end = CFAbsoluteTimeGetCurrent() - start; // 100ms if (end - start > 0.1) { NSLog(@"%@", logFormat); NSParameterAssert(NO); } return results; }
MIGRATION WHAT REALLY HAPPENS?
Z_METADATA - PLIST
DIFFERENT HASH? BTUSER BTUSER_BAK Rename
DIFFERENT HASH? BTUSER_BAK BTUSER Insert
DIFFERENT HASH? BTUSER_BAK BTUSER
DIFFERENT HASH? BTUSER
Z_PRIMARYKEY TABLE
Z_PRIMARYKEY TABLE
Z_ENT - ALPHABETICAL ORDER 18 | BTLINKEDCONTACT 19 | BTMESSAGE
Z_ENT - ALPHABETICAL ORDER 18 | BTLINKEDCONTACT 19 | BTMESSAGE
XX | BTMARY
Z_ENT 19 | BTMESSAGE 18 | BTLINKEDCONTACT XX | BTMARY
Z_ENT 18 | BTLINKEDCONTACT 20 | BTMESSAGE 19 | BTMARY
Z_PRIMARYKEY
HOW TO FIX?
Z_ENT 18 | BTLINKEDCONTACT 19 | BTMESSAGE 50 | BTZMARY
Z_ENT 18 | BTLINKEDCONTACT 19 | BTMESSAGE 50 | BTZMARY
Q&A