рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдкрд░ рдПрдХ рдФрд░ ActiveRecord рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкрд░ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ iOS рдХреЗ рд▓рд┐рдП ActiveRecord рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЬрдм рдореИрдВ рдЖрдИрдУрдПрд╕ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХреЛрд░рдбрд╛рдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛, рддрдм рднреА рд╡рд┐рдЪрд╛рд░ рдереЗ рдХрд┐ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдореИрдВ RubyOnRails рд╕реЗ ActiveRecord рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛, рдФрд░ рддрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдЧрд┐рдердм рдкрд░ рдереЛрдбрд╝рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореБрдЭреЗ рд╡реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдПред рдХреБрдЫ CoreData рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдпрд╛ рдХрдЪреНрдЪреЗ sql рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдЕрд╢реНрд▓реАрд▓ рд░реВрдк рд╕реЗ рднрдпрд╛рдирдХ рдерд╛, рдореИрдВ рдХрднреА-рдХрднреА рдЦреБрдж рдХреЛ рдмрд╣реБрдд рд╕рдлрд╛рдИ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛, рд▓реЗрдХрд┐рди рд╕рдВрд▓рдЧреНрди рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╛рдбрд╝ рдЕрдЧрд░ / рд╕реНрд╡рд┐рдЪ / рдЕрдЧрд░ / рд╕реНрд╡рд┐рдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдмрд┐рдирд╛ CoreData рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП SQL рдХреЗ рдмрд┐рдирд╛ред
рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдерд╛, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛрдЧреАред

рдпрд╣рд╛рдБ рдпрд╣ рд╕рдм рдХреНрдпрд╛ рдЖрдпрд╛ рд╣реИред
рдФрд░ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рда рдФрд░ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ, рд▓реЗрдЦ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢)ред

рдЯреЗрдмрд▓ рдирд┐рд░реНрдорд╛рдг


рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рдереАред
рдХреЛрд░рдбрд╛рдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕реАрдбреА рдмрд╛рдХреА рдХрд╛рдо рдХрд░реЗрдЧреАред
рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдпрд╣ рдореБрдЭ рдкрд░ рд╣рд╛рд╡реА рд╣реЛ рдЧрдпрд╛ред
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрдХрд╛рдИ рдХрд╛ рд╡рд┐рд╡рд░рдг рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛, рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ SQL рдХреНрд╡реЗрд░реА рдХреА рд░рдЪрдирд╛ рдХрд░рдирд╛ рд╣реИред
рдЗрдХрд╛рдИ рд╡рд┐рд╡рд░рдг

@interface User : ActiveRecord @property (nonatomic, retain) NSString *name; @end 

рд╕рднреА рдЙрдкрд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

 static NSArray *class_getSubclasses(Class parentClass) { int numClasses = objc_getClassList(NULL, 0); Class *classes = NULL; classes = malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); NSMutableArray *result = [NSMutableArray array]; for (NSInteger i = 0; i < numClasses; i++) { Class superClass = classes[i]; do{ superClass = class_getSuperclass(superClass); } while(superClass && superClass != parentClass); if (superClass == nil) { continue; } [result addObject:classes[i]]; } return result; } 

рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рддрдХ рд▓реЗ рдЬрд╛рдирд╛

 Class BaseClass = NSClassFromString(@"NSObject"); id CurrentClass = aRecordClass; while(nil != CurrentClass && CurrentClass != BaseClass){ unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(CurrentClass, &outCount); for (i = 0; i < outCount; i++) { // do something with concrete property => properties[i] } CurrentClass = class_getSuperclass(CurrentClass); } 


рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░


рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЗрдВрдЯ, рдбрдмрд▓ рдЖрджрд┐) рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдХреЗрд╡рд▓ рдЯреЗрдмрд▓ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛: рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ ARRepresentationProtocol рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

 @protocol ARRepresentationProtocol @required + (const char *)sqlType; - (NSString *)toSql; + (id)fromSql:(NSString *)sqlData; @end 

рдореИрдВрдиреЗ рдЗрди рдкрджреНрдзрддрд┐рдпреЛрдВ рдХреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлрд╛рдЙрдВрдбреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ
- NSDecimalNumber - рд╡рд╛рд╕реНрддрд╡рд┐рдХ
- NSNumber - рдкреВрд░реНрдгрд╛рдВрдХ
- рдПрдирдПрд╕рдПрд╕рдЯреНрд░рд┐рдВрдЧ - рдкрд╛рда
- рдПрдирдПрд╕рдбреЗрдЯрд╛ - рдмреВрдБрдж
- NSDate - рддрд┐рдерд┐ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ)
рд▓реЗрдХрд┐рди рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдард┐рдирд╛рдИ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде CoreData рдЖрдкрдХреЛ рдПрдХ рд╣реА рдЪреАрдЬ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реА.рдЖрд░.рдпреВ.рдбреА.


рдмрдирд╛рдПрдВ

рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред

 User *user = [User newRecord]; user.name = @"Alex"; [user save]; 

рдкрдврд╝реЗрдВ

рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ

 NSArray *users = [User allRecords]; 

рдЕрдХреНрд╕рд░, рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХред

рдЕрджреНрдпрддрди

 User *user = [User newRecord]; user.name = @"Alex"; [user save]; NSArray *users = [User allRecords]; User *userForUpdate = [users first]; userForUpdate.name = @"John"; [userForUpdate update]; //  [userForUpdate save]; 

ActiveRecord рд╕рднреА рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рд╣рдЯрд╛рдПрдВ

 NSArray *users = [User allRecords]; User *userForRemove = [users first]; [userForRemove dropRecord]; 

рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдЖрдИрдбреА (NSNumber) рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЦреЗрдд


рдЙрди рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ? рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ :)
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рд╣реИред

 @implementation User ... @synthesize ignoredProperty; ... ignore_fields_do( ignore_field(ignoredProperty) ) ... @end 


рдорд╛рдиреНрдпрддрд╛


рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рдВрдЧреЗрдВ рд░рдЦреАрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдердиред
рдлрд┐рд▓рд╣рд╛рд▓, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдПред
рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд░рд▓ рд╣реИ рдФрд░ рдпрд╣ рднреА рдХреЛрд▓ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдХреНрд╖рд╛ рдХреЛ ARValidatableProtocol рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рддрдВрддреНрд░ рдХреЛ рд╢реБрд░реВ рди рдХрд░реЗрдВ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

 // User.h @interface User : ActiveRecord <ARValidatableProtocol> ... @property (nonatomic, copy) NSString *name; ... @end // User.m @implementation User ... validation_do( validate_uniqueness_of(name) validate_presence_of(name) ) ... @end 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ ARValidatorProtocol рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдорд╛рдиреНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░реЗред
ARValidatorProtocol

 @protocol ARValidatorProtocol <NSObject> @optional - (NSString *)errorMessage; @required - (BOOL)validateField:(NSString *)aField ofRecord:(id)aRecord; @end 

рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛

 // PrefixValidator.h @interface PrefixValidator : NSObject <ARValidatorProtocol> @end // PrefixValidator.m @implementation PrefixValidator - (NSString *)errorMessage { return @"Invalid prefix"; } - (BOOL)validateField:(NSString *)aField ofRecord:(id)aRecord { NSString *aValue = [aRecord valueForKey:aField]; BOOL valid = [aValue hasPrefix:@"LOL"]; return valid; } @end 

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


рд╕рд╣реЗрдЬреЗрдВ, рдЕрдкрдбреЗрдЯ, рдФрд░ isValid рддрд░реАрдХреЗ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ; рдпрджрд┐ рдЧрд▓рдд / NO рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 [user errors]; 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХреНрд▓рд╛рд╕ рдЕрд░реЗрд╕реНрдЯрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА

 @interface ARError : NSObject @property (nonatomic, copy) NSString *modelName; @property (nonatomic, copy) NSString *propertyName; @property (nonatomic, copy) NSString *errorName; - (id)initWithModel:(NSString *)aModel property:(NSString *)aProperty error:(NSString *)anError; @end 

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╕реНрддреГрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡реЗ рдХреАрд╡рд░реНрдб рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджреЗрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╡рд╛рд╕


рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдПрдХ рдЖрджрд┐рдо рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдЯреЗрдмрд▓ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдП рдХреНрд╖реЗрддреНрд░ рдпрд╛ рдЯреЗрдмрд▓ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╣реИрдВ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╢реНрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рддреБрд░рдВрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ActiveRecord рдХреЗ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 [ActiveRecord disableMigrations]; 

рд▓реЗрди-рджреЗрди


рдореИрдВрдиреЗ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд▓рд╛рдЧреВ рдХреА, рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 [ActiveRecord transaction:^{ User *alex = [User newRecord]; alex.name = @"Alex"; [alex save]; rollback }]; 

рд░реЛрд▓рдмреИрдХ - рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореИрдХреНрд░реЛ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред
Tarnzaktsii рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реЛрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм 9,000 рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рдереА, рддреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рдмреНрд░реЗрдХ рдерд╛ред рдбрдВрдк рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ 180 рд╕реЗрдХрдВрдб рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ BEGIN рд▓реЗрдирджреЗрди рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдерд╛; ... COMMIT; рд╕рдордп рдШрдЯрдХрд░ ~ 4-5 рд╕реЗрдХрдВрдб рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред

рд╕рдВрдЪрд╛рд░


рдЬрдм рдореИрдВ RoR рдореЗрдВ ActiveRecord рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдЖ, рддреЛ рдореБрдЭреЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдЦреБрд╢реА рд╣реБрдИред рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реА, рдЗрд╕ рд╕рд╛рджрдЧреА рдиреЗ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред рдФрд░ рдЕрдм рдореИрдВ рдЕрдкрдиреА рдмрд╛рдЗрдХ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рд╛рджрдЧреА рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдорд╛рдирддрд╛ рд╣реВрдВред
рд╣рд╕реНрдорд╛рдиреА <-> рдмрд┐рд▓реЛрдВрдЧреНрд╕рдЯреЛ

 // User.h @interface User : ActiveRecord ... @property (nonatomic, retain) NSNumber *groupId; ... belongs_to_dec(Group, group, ARDependencyNullify) ... @end // User.m @implementation User ... @synthesize groupId; ... belonsg_to_imp(Group, group, ARDependencyNullify) ... @end 


рдЕрдВрддрд░реНрдЧрдд_рддрдХ_dec belonsg_to_imp рдореИрдХреНрд░реЛрдЬрд╝ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ: рдЬрд┐рд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╣рдо рд╕рдВрдкрд░реНрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рд╣реИ, рдЧреЗрдЯреНрдЯрд░ рдХрд╛ рдирд╛рдо рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ред
рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ: ARD dependencyNullify рдФрд░ ARD dependencyDestroy, рдкрд╣рд▓рд╛ рдЬрдм рдореЙрдбрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЙрд╕рдХреЗ рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рд╕рдВрдмрдВрдз рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдХреЛ рдореЙрдбрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд▓реЛрдЕрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рд╕рдореВрд╣ <-> groupId
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ <-> userId
ContentManager <-> contentManagerId
EMCategory <-> eMCategory // рдереЛрдбрд╝рд╛ рдЕрдирд╛рдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд╣реИ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рд╣рд╕реНрдорд╛рдиреА)

 // Group.h @interface Group : ActiveRecord ... has_many_dec(User, users, ARDependencyDestroy) ... @end // Group.m @implementation Group ... has_many_imp(User, users, ARDependencyDestroy) ... @end 

BelongsTo рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреЗ рд╕рд╛рде рднреАред
рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд: рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рджреЛрдиреЛрдВ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрдИрдбреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рд▓рд┐рдВрдХ рдЗрд╕реЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред

HasManyThrough


рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрдиреНрдп рдореЙрдбрд▓, рдПрдХ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

 // User.h @interface User : ActiveRecord ... has_many_through_dec(Project, UserProjectRelationship, projects, ARDependencyNullify) ... @end // User.m @implementation User ... has_many_through_imp(Project, UserProjectRelationship, projects, ARDependencyNullify) ... @end // Project.h @interface Project : ActiveRecord ... has_many_through_dec(User, UserProjectRelationship, users, ARDependencyDestroy) ... @end // Project.m @implementation Project ... has_many_through_imp(User, UserProjectRelationship, users, ARDependencyDestroy) ... @end 

рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЙрдбрд▓

 // UserProjectRelationship.h @interface UserProjectRelationship : ActiveRecord @property (nonatomic, retain) NSNumber *userId; @property (nonatomic, retain) NSNumber *projectId; @end // UserProjectRelationship.m @implementation UserProjectRelationship @synthesize userId; @synthesize projectId; @end 

рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рд╣рд╕рдиреА рдХреЗ рд╕рдорд╛рди рд╣реА рдиреБрдХрд╕рд╛рди рд╣реИрдВред

* _Dec / * _ imp рдореИрдХреНрд░реЛ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
 set#ModelName:(ActiveRecord *)aRecord; // BelongsTo add##ModelName:(ActiveRecord *)aRecord; // HasMany, HasManyThrough remove##ModelName:(ActiveRecord *)aRecord; // HasMany, HasManyThrough 

рдХреНрд╡реЗрд░реА рдлрд╝рд┐рд▓реНрдЯрд░


рдмрд╣реБрдд рдмрд╛рд░, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
- рдХреБрдЫ рдЯреЗрдореНрдкреНрд▓реЗрдЯ (UISearchBar) рдХреЗ рдЕрдиреБрд░реВрдк рд░рд┐рдХреЙрд░реНрдб рдХреА рдЦреЛрдЬ
- рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣рдЬрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 5 рд░рд┐рдХреЙрд░реНрдб рд╣реИ
- рдХреЗрд╡рд▓ "рднрд╛рд░реА" рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдвреЗрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛, рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдХреЗрд╡рд▓ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк :)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рд░реВрдмреА рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд╣рд┐рдд "рдЖрд▓рд╕реНрдп" рдХреЛ рдпрд╛рдж рдЖрдпрд╛, рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдорд╛рдВрдЧ рдкрд░ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдпрд╣ рдЖрдпрд╛ рд╣реИред

рд╕реАрдорд╛ / рдСрдлрд╕реЗрдЯ

 NSArray *users = [[[User lazyFetcher] limit:5] fetchRecords]; NSArray *users = [[[User lazyFetcher] offset:5] fetchRecords]; NSArray *users = [[[[User lazyFetcher] offset:5] limit:2] fetchRecords]; 

рдХреЗрд╡рд▓ / рдЫреЛрдбрд╝рдХрд░

 ARLazyFetcher *fetcher = [[User lazyFetcher] only:@"name", @"id", nil]; ARLazyFetcher *fetcher = [[User lazyFetcher] except:@"veryBigImage", nil]; 

рдЬрд╣рд╛рдБ

iActiveRecord рдЬрд╣рд╛рдВ рдЖрдзрд╛рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

 - (ARLazyFetcher *)whereField:(NSString *)aField equalToValue:(id)aValue; - (ARLazyFetcher *)whereField:(NSString *)aField notEqualToValue:(id)aValue; - (ARLazyFetcher *)whereField:(NSString *)aField in:(NSArray *)aValues; - (ARLazyFetcher *)whereField:(NSString *)aField notIn:(NSArray *)aValues; - (ARLazyFetcher *)whereField:(NSString *)aField like:(NSString *)aPattern; - (ARLazyFetcher *)whereField:(NSString *)aField notLike:(NSString *)aPattern; - (ARLazyFetcher *)whereField:(NSString *)aField between:(id)startValue and:(id)endValue; - (ARLazyFetcher *)where:(NSString *)aFormat, ...; 

рд╡рд╣реА рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ NSPredicate'ov рдХреА рд╢реИрд▓реА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 NSArray *ids = [NSArray arrayWithObjects: [NSNumber numberWithInt:1], [NSNumber numberWithInt:15], nil]; NSString *username = @"john"; ARLazyFetcher *fetcher = [User lazyFetcher]; [fetcher where:@"'user'.'name' = %@ or 'user'.'id' in %@", username, ids, nil]; NSArray *records = [fetcher fetchRecords]; 

рдПрд╕реЛрд╕рд┐рдПрд╢рди (рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ)


рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рдХрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 - (ARLazyFetcher *)join:(Class)aJoinRecord useJoin:(ARJoinType)aJoinType onField:(NSString *)aFirstField andField:(NSString *)aSecondField; 

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреБрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛
- ARJoinLeft
- ARJoinRight
- ARJoinInner
- ARJoinOuter
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВред
рдПрдХ рдЫреЛрдЯреА рдмреИрд╕рд╛рдЦреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдпреБрдХреНрдд рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 - (NSArray *)fetchJoinedRecords; 

рдХреЗ рдмрдЬрд╛рдп

 - (NSArray *)fetchRecords; 

рдпрд╣ рд╡рд┐рдзрд┐ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рд╕реЗ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдЗрдХрд╛рдИ рдирд╛рдо рд╣реИрдВ рдФрд░ рдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╣реИрдВред

рдЫрдВрдЯрд╛рдИ


 - (ARLazyFetcher *)orderBy:(NSString *)aField ascending:(BOOL)isAscending; - (ARLazyFetcher *)orderBy:(NSString *)aField;// ASC   ARLazyFetcher *fetcher = [[[User lazyFetcher] offset:2] limit:10]; [[fetcher whereField:@"name" equalToValue:@"Alex"] orderBy:@"name"]; NSArray *users = [fetcher fetchRecords]; 


рдХреЛрд╖


рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреИрд╢ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рднрдВрдбрд╛рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреИрдХрдЕрдк рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ

 u_int8_t b = 1; setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0); 

рдЕрдиреНрдпрдерд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Apple рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рд░рд╛рдВрд╢


рдЧрдердм рдкреНрд░реЛрдЬреЗрдХреНрдЯ iActiveRecord рд╣реИ ред
рдЕрд╡рд╕рд░реЛрдВ


рдирд┐рд╖реНрдХрд░реНрд╖



рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП , рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реБрдИ рдереА, рдФрд░ рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд╣реИ, рдЕрдВрдд рдореЗрдВ "рдЧрдВрджреЗ" рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

рдореИрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЖрд▓реЛрдЪрдирд╛ рд╕реБрдирдХрд░ рдкреНрд░рд╕рдиреНрди рд╣реВрдВред

PS рд▓реИрди рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦреЗрдВ, рдХреГрдкрдпрд╛ред

Source: https://habr.com/ru/post/In145108/


All Articles