mirror of
https://github.com/zhigang1992/MagicalRecord.git
synced 2026-01-12 17:32:18 +08:00
Fix some data import tests
Added data update tests
This commit is contained in:
@@ -7,6 +7,16 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
C7005F1214140F9B0061B9F4 /* NSNumber+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1114140F9B0061B9F4 /* NSNumber+MagicalDataImport.m */; };
|
||||
C7005F1314140F9B0061B9F4 /* NSNumber+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1114140F9B0061B9F4 /* NSNumber+MagicalDataImport.m */; };
|
||||
C7005F1614140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1514140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m */; };
|
||||
C7005F1714140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1514140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m */; };
|
||||
C7005F1A14140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1914140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m */; };
|
||||
C7005F1B14140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1914140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m */; };
|
||||
C7005F1E1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1D1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m */; };
|
||||
C7005F1F1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F1D1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m */; };
|
||||
C7005F2214153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F2114153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m */; };
|
||||
C7005F2314153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C7005F2114153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m */; };
|
||||
C70B6E7113D0F62500709450 /* NSPersisentStoreHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C70B6E7013D0F62500709450 /* NSPersisentStoreHelperTests.m */; };
|
||||
C70B6E7413D0F64000709450 /* NSPersistentStoreCoordinatorHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C70B6E7313D0F64000709450 /* NSPersistentStoreCoordinatorHelperTests.m */; };
|
||||
C70B6E7713D0F66000709450 /* NSManagedObjectModelHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C70B6E7613D0F66000709450 /* NSManagedObjectModelHelperTests.m */; };
|
||||
@@ -141,6 +151,16 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
C7005F1014140F9B0061B9F4 /* NSNumber+MagicalDataImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSNumber+MagicalDataImport.h"; path = "DataImport/NSNumber+MagicalDataImport.h"; sourceTree = "<group>"; };
|
||||
C7005F1114140F9B0061B9F4 /* NSNumber+MagicalDataImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+MagicalDataImport.m"; path = "DataImport/NSNumber+MagicalDataImport.m"; sourceTree = "<group>"; };
|
||||
C7005F1414140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSAttributeDescription+MagicalDataImport.h"; path = "DataImport/NSAttributeDescription+MagicalDataImport.h"; sourceTree = "<group>"; };
|
||||
C7005F1514140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSAttributeDescription+MagicalDataImport.m"; path = "DataImport/NSAttributeDescription+MagicalDataImport.m"; sourceTree = "<group>"; };
|
||||
C7005F1814140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSRelationshipDescription+MagicalDataImport.h"; path = "DataImport/NSRelationshipDescription+MagicalDataImport.h"; sourceTree = "<group>"; };
|
||||
C7005F1914140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSRelationshipDescription+MagicalDataImport.m"; path = "DataImport/NSRelationshipDescription+MagicalDataImport.m"; sourceTree = "<group>"; };
|
||||
C7005F1C1414100F0061B9F4 /* NSDictionary+MagicalDataImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+MagicalDataImport.h"; path = "DataImport/NSDictionary+MagicalDataImport.h"; sourceTree = "<group>"; };
|
||||
C7005F1D1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+MagicalDataImport.m"; path = "DataImport/NSDictionary+MagicalDataImport.m"; sourceTree = "<group>"; };
|
||||
C7005F2014153A060061B9F4 /* NSEntityDescription+MagicalDataImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSEntityDescription+MagicalDataImport.h"; path = "DataImport/NSEntityDescription+MagicalDataImport.h"; sourceTree = "<group>"; };
|
||||
C7005F2114153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSEntityDescription+MagicalDataImport.m"; path = "DataImport/NSEntityDescription+MagicalDataImport.m"; sourceTree = "<group>"; };
|
||||
C70B6E6F13D0F62500709450 /* NSPersisentStoreHelperTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSPersisentStoreHelperTests.h; path = "Unit Tests/NSPersisentStoreHelperTests.h"; sourceTree = "<group>"; };
|
||||
C70B6E7013D0F62500709450 /* NSPersisentStoreHelperTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSPersisentStoreHelperTests.m; path = "Unit Tests/NSPersisentStoreHelperTests.m"; sourceTree = "<group>"; };
|
||||
C70B6E7213D0F64000709450 /* NSPersistentStoreCoordinatorHelperTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSPersistentStoreCoordinatorHelperTests.h; path = "Unit Tests/NSPersistentStoreCoordinatorHelperTests.h"; sourceTree = "<group>"; };
|
||||
@@ -327,6 +347,25 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
C7005F0E14140F690061B9F4 /* Data Import */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C75A4E7113D0D88D00790CEB /* NSManagedObject+MagicalDataImport.h */,
|
||||
C75A4E7213D0D88D00790CEB /* NSManagedObject+MagicalDataImport.m */,
|
||||
C7005F1014140F9B0061B9F4 /* NSNumber+MagicalDataImport.h */,
|
||||
C7005F1114140F9B0061B9F4 /* NSNumber+MagicalDataImport.m */,
|
||||
C7005F1414140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.h */,
|
||||
C7005F1514140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m */,
|
||||
C7005F1814140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.h */,
|
||||
C7005F1914140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m */,
|
||||
C7005F1C1414100F0061B9F4 /* NSDictionary+MagicalDataImport.h */,
|
||||
C7005F1D1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m */,
|
||||
C7005F2014153A060061B9F4 /* NSEntityDescription+MagicalDataImport.h */,
|
||||
C7005F2114153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m */,
|
||||
);
|
||||
name = "Data Import";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C721C7A013D0A3750097AB6F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -501,8 +540,7 @@
|
||||
C721C85813D0C7030097AB6F /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C75A4E7113D0D88D00790CEB /* NSManagedObject+MagicalDataImport.h */,
|
||||
C75A4E7213D0D88D00790CEB /* NSManagedObject+MagicalDataImport.m */,
|
||||
C7005F0E14140F690061B9F4 /* Data Import */,
|
||||
C721C85B13D0C7030097AB6F /* NSManagedObject+MagicalRecord.h */,
|
||||
C721C85C13D0C7030097AB6F /* NSManagedObject+MagicalRecord.m */,
|
||||
C721C85D13D0C7030097AB6F /* NSManagedObjectContext+MagicalRecord.h */,
|
||||
@@ -873,6 +911,11 @@
|
||||
C7BD887013DBF88F00274567 /* SingleEntityWithNoRelationships.m in Sources */,
|
||||
C7BD887113DBF88F00274567 /* SingleRelatedEntity.m in Sources */,
|
||||
C7BD887213DBF88F00274567 /* TestModel.xcdatamodeld in Sources */,
|
||||
C7005F1214140F9B0061B9F4 /* NSNumber+MagicalDataImport.m in Sources */,
|
||||
C7005F1614140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m in Sources */,
|
||||
C7005F1A14140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m in Sources */,
|
||||
C7005F1E1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m in Sources */,
|
||||
C7005F2214153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -929,6 +972,11 @@
|
||||
C78F8FDA13FDC3F400549DD8 /* SingleEntityRelatedToMappedEntityWithSecondaryMappings.m in Sources */,
|
||||
C78F8FDD13FDC3FD00549DD8 /* _SingleEntityRelatedToMappedEntityWithSecondaryMappings.m in Sources */,
|
||||
C738127A1410398A0054EEF0 /* ImportSingleEntityRelatedToManyMappedEntitiesUsingListOfPrimaryKeysTests.m in Sources */,
|
||||
C7005F1314140F9B0061B9F4 /* NSNumber+MagicalDataImport.m in Sources */,
|
||||
C7005F1714140FB60061B9F4 /* NSAttributeDescription+MagicalDataImport.m in Sources */,
|
||||
C7005F1B14140FD30061B9F4 /* NSRelationshipDescription+MagicalDataImport.m in Sources */,
|
||||
C7005F1F1414100F0061B9F4 /* NSDictionary+MagicalDataImport.m in Sources */,
|
||||
C7005F2314153A060061B9F4 /* NSEntityDescription+MagicalDataImport.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// NSAttributeDescription+MagicalDataImport.h
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import <CoreData/CoreData.h>
|
||||
|
||||
@interface NSAttributeDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// NSAttributeDescription+MagicalDataImport.m
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSAttributeDescription+MagicalDataImport.h"
|
||||
|
||||
@implementation NSAttributeDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// NSDictionary+MagicalDataImport.h
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSDictionary (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo;
|
||||
- (id) MR_valueForAttribute:(NSAttributeDescription *)attributeInfo;
|
||||
|
||||
- (NSString *) MR_lookupKeyForRelationship:(NSRelationshipDescription *)relationshipInfo;
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// NSDictionary+MagicalDataImport.m
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSDictionary+MagicalDataImport.h"
|
||||
|
||||
NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
|
||||
|
||||
@implementation NSDictionary (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo;
|
||||
{
|
||||
NSString *attributeName = [attributeInfo name];
|
||||
NSString *lookupKey = [[attributeInfo userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: attributeName;
|
||||
|
||||
id value = [self valueForKeyPath:lookupKey];
|
||||
|
||||
for (int i = 1; i < kMagicalRecordImportMaximumAttributeFailoverDepth && value == nil; i++)
|
||||
{
|
||||
attributeName = [NSString stringWithFormat:@"%@.%d", kMagicalRecordImportAttributeKeyMapKey, i];
|
||||
lookupKey = [[attributeInfo userInfo] valueForKey:attributeName];
|
||||
if (lookupKey == nil)
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
value = [self valueForKeyPath:lookupKey];
|
||||
}
|
||||
|
||||
return value != nil ? lookupKey : nil;
|
||||
}
|
||||
|
||||
- (id) MR_valueForAttribute:(NSAttributeDescription *)attributeInfo
|
||||
{
|
||||
NSString *lookupKey = [self MR_lookupKeyForAttribute:attributeInfo];
|
||||
return lookupKey ? [self valueForKeyPath:lookupKey] : nil;
|
||||
}
|
||||
|
||||
- (NSString *) MR_lookupKeyForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
NSEntityDescription *destinationEntity = [relationshipInfo destinationEntity];
|
||||
if (destinationEntity == nil)
|
||||
{
|
||||
ARLog(@"Unable to find entity for type '%@'", [self valueForKey:kMagicalRecordImportRelationshipTypeKey]);
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSString *primaryKeyName = [relationshipInfo MR_primaryKey];
|
||||
|
||||
NSAttributeDescription *primaryKeyAttribute = [[destinationEntity attributesByName] valueForKey:primaryKeyName];
|
||||
NSString *lookupKey = [[primaryKeyAttribute userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: [primaryKeyAttribute name];
|
||||
|
||||
return lookupKey;
|
||||
}
|
||||
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
NSString *lookupKey = [self MR_lookupKeyForRelationship:relationshipInfo];
|
||||
return lookupKey ? [self valueForKeyPath:lookupKey] : nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,14 @@
|
||||
//
|
||||
// NSEntityDescription+MagicalDataImport.h
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/5/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
|
||||
@interface NSEntityDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSAttributeDescription *) MR_primaryKeyAttribute;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// NSEntityDescription+MagicalDataImport.m
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/5/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import "CoreData+MagicalRecord.h"
|
||||
|
||||
NSString * const kMagicalRecordImportPrimaryAttributeKey = @"primaryAttributeKey";
|
||||
|
||||
@implementation NSEntityDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSAttributeDescription *) MR_primaryKeyAttribute;
|
||||
{
|
||||
NSString *lookupKey = [[self userInfo] valueForKey:kMagicalRecordImportPrimaryAttributeKey] ?: primaryKeyNameFromString([self name]);
|
||||
NSAttributeDescription *primaryAttribute = [[self attributesByName] valueForKey:lookupKey];
|
||||
|
||||
if (primaryAttribute == nil)
|
||||
{
|
||||
NSAssert3(primaryAttribute != nil, @"Unable to determine primary attribute for %@. Specify either an attribute named %@ or the primary key in userInfo named '%@'", [self name], primaryKeyNameFromString([self name]), kMagicalRecordImportPrimaryAttributeKey);
|
||||
}
|
||||
|
||||
return primaryAttribute;
|
||||
}
|
||||
|
||||
@end
|
||||
16
Source/Categories/DataImport/NSNumber+MagicalDataImport.h
Normal file
16
Source/Categories/DataImport/NSNumber+MagicalDataImport.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// NSNumber+MagicalDataImport.h
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSNumber (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo;
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo;
|
||||
|
||||
@end
|
||||
25
Source/Categories/DataImport/NSNumber+MagicalDataImport.m
Normal file
25
Source/Categories/DataImport/NSNumber+MagicalDataImport.m
Normal file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// NSNumber+MagicalDataImport.m
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSNumber+MagicalDataImport.h"
|
||||
|
||||
|
||||
|
||||
@implementation NSNumber (MagicalRecord_DataImport)
|
||||
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// NSRelationshipDescription+MagicalDataImport.h
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import <CoreData/CoreData.h>
|
||||
|
||||
@interface NSRelationshipDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// NSRelationshipDescription+MagicalDataImport.m
|
||||
// Magical Record
|
||||
//
|
||||
// Created by Saul Mora on 9/4/11.
|
||||
// Copyright 2011 Magical Panda Software LLC. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSRelationshipDescription+MagicalDataImport.h"
|
||||
|
||||
@implementation NSRelationshipDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
{
|
||||
NSString *primaryKeyName = [[self userInfo] valueForKey:kMagicalRecordImportRelationshipPrimaryKey] ?:
|
||||
primaryKeyNameFromString([[self destinationEntity] name]);
|
||||
|
||||
return primaryKeyName;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -19,7 +19,8 @@ extern NSString * const kMagicalRecordImportRelationshipTypeKey;
|
||||
|
||||
@interface NSManagedObject (NSManagedObject_DataImport)
|
||||
|
||||
- (void) MR_setValuesForKeysWithJSONDictionary:(NSDictionary *)jsonData;
|
||||
- (void) MR_importValuesForKeysWithDictionary:(NSDictionary *)objectData;
|
||||
- (void) MR_updateValuesForKeysWithDictionary:(NSDictionary *)objectData;
|
||||
|
||||
+ (id) MR_importFromDictionary:(NSDictionary *)data;
|
||||
+ (id) MR_importFromDictionary:(NSDictionary *)data inContext:(NSManagedObjectContext *)context;
|
||||
@@ -27,6 +28,9 @@ extern NSString * const kMagicalRecordImportRelationshipTypeKey;
|
||||
+ (NSArray *) MR_importFromArray:(NSArray *)listOfObjectData;
|
||||
+ (NSArray *) MR_importFromArray:(NSArray *)listOfObjectData inContext:(NSManagedObjectContext *)context;
|
||||
|
||||
+ (id) MR_updateFromDictionary:(NSDictionary *)objectData;
|
||||
+ (id) MR_updateFromDictionary:(NSDictionary *)objectData inContext:(NSManagedObjectContext *)context;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -16,89 +16,7 @@ NSString * const kMagicalRecordImportAttributeValueClassNameKey = @"attributeVal
|
||||
NSString * const kMagicalRecordImportRelationshipMapKey = @"mappedKeyName";
|
||||
NSString * const kMagicalRecordImportRelationshipPrimaryKey = @"primaryRelationshipKey";
|
||||
NSString * const kMagicalRecordImportRelationshipTypeKey = @"type";
|
||||
NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
|
||||
@implementation NSAttributeDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@implementation NSRelationshipDescription (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_primaryKey;
|
||||
{
|
||||
NSString *primaryKeyName = [[self userInfo] valueForKey:kMagicalRecordImportRelationshipPrimaryKey] ?:
|
||||
primaryKeyNameFromString([[self destinationEntity] name]);
|
||||
|
||||
return primaryKeyName;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSDictionary (MagicalRecord_DataImport)
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo;
|
||||
{
|
||||
NSString *attributeName = [attributeInfo name];
|
||||
NSString *lookupKey = [[attributeInfo userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: attributeName;
|
||||
|
||||
id value = [self valueForKeyPath:lookupKey];
|
||||
|
||||
for (int i = 1; i < kMagicalRecordImportMaximumAttributeFailoverDepth && value == nil; i++)
|
||||
{
|
||||
attributeName = [NSString stringWithFormat:@"%@.%d", kMagicalRecordImportAttributeKeyMapKey, i];
|
||||
lookupKey = [[attributeInfo userInfo] valueForKey:attributeName];
|
||||
if (lookupKey == nil)
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
value = [self valueForKeyPath:lookupKey];
|
||||
}
|
||||
|
||||
return value != nil ? lookupKey : nil;
|
||||
}
|
||||
|
||||
- (NSString *) MR_lookupKeyForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
NSEntityDescription *destinationEntity = [relationshipInfo destinationEntity];
|
||||
if (destinationEntity == nil)
|
||||
{
|
||||
ARLog(@"Unable to find entity for type '%@'", [self valueForKey:kMagicalRecordImportRelationshipTypeKey]);
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSString *primaryKeyName = [relationshipInfo MR_primaryKey];
|
||||
|
||||
NSAttributeDescription *primaryKeyAttribute = [[destinationEntity attributesByName] valueForKey:primaryKeyName];
|
||||
NSString *lookupKey = [[primaryKeyAttribute userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: [primaryKeyAttribute name];
|
||||
|
||||
return lookupKey;
|
||||
}
|
||||
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
NSString *lookupKey = [self MR_lookupKeyForRelationship:relationshipInfo];
|
||||
return lookupKey ? [self valueForKeyPath:lookupKey] : nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSNumber (MagicalRecord_DataImport)
|
||||
|
||||
- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *) MR_lookupKeyForAttribute:(NSAttributeDescription *)attributeInfo
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSManagedObject (MagicalRecord_DataImport)
|
||||
@@ -152,7 +70,7 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
NSManagedObject *relatedObject = [NSEntityDescription insertNewObjectForEntityForName:[entityDescription name]
|
||||
inManagedObjectContext:[self managedObjectContext]];
|
||||
|
||||
[relatedObject MR_setValuesForKeysWithJSONDictionary:objectData];
|
||||
[relatedObject MR_importValuesForKeysWithDictionary:objectData];
|
||||
|
||||
return relatedObject;
|
||||
}
|
||||
@@ -200,7 +118,7 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) MR_setRelationships:(NSDictionary *)relationships forKeysWithDictionary:(NSDictionary *)relationshipData withBlock:(void(^)(NSRelationshipDescription *,NSDictionary *))setRelationshipBlock
|
||||
- (void) MR_setRelationships:(NSDictionary *)relationships forKeysWithDictionary:(NSDictionary *)relationshipData withBlock:(void(^)(NSRelationshipDescription *,id))setRelationshipBlock
|
||||
{
|
||||
for (NSString *relationshipName in relationships)
|
||||
{
|
||||
@@ -215,7 +133,7 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ([relationshipInfo isToMany] ) //|| [relatedObjectData isKindOfClass:[NSArray class]])
|
||||
if ([relationshipInfo isToMany])
|
||||
{
|
||||
for (id singleRelatedObjectData in relatedObjectData)
|
||||
{
|
||||
@@ -229,11 +147,40 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) MR_setRelationships:(NSDictionary *)relationships forKeysWithDictionary:(NSDictionary *)relationshipData
|
||||
- (void) MR_importValuesForKeysWithDictionary:(NSDictionary *)objectData
|
||||
{
|
||||
NSDictionary *attributes = [[self entity] attributesByName];
|
||||
[self MR_setAttributes:attributes forKeysWithDictionary:objectData];
|
||||
|
||||
NSDictionary *relationships = [[self entity] relationshipsByName];
|
||||
[self MR_setRelationships:relationships
|
||||
forKeysWithDictionary:relationshipData
|
||||
withBlock:^(NSRelationshipDescription *relationshipInfo, NSDictionary *objectData)
|
||||
forKeysWithDictionary:objectData
|
||||
withBlock:^(NSRelationshipDescription *relationshipInfo, id objectData)
|
||||
{
|
||||
NSManagedObject *relatedObject = nil;
|
||||
if ([objectData isKindOfClass:[NSDictionary class]])
|
||||
{
|
||||
relatedObject = [self MR_createInstanceForEntity:[relationshipInfo destinationEntity] withDictionary:objectData];
|
||||
}
|
||||
else
|
||||
{
|
||||
relatedObject = [self MR_findObjectForRelationship:relationshipInfo withData:objectData];
|
||||
}
|
||||
[relatedObject MR_importValuesForKeysWithDictionary:objectData];
|
||||
|
||||
[self MR_addObject:relatedObject forRelationship:relationshipInfo];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void) MR_updateValuesForKeysWithDictionary:(NSDictionary *)objectData
|
||||
{
|
||||
NSDictionary *attributes = [[self entity] attributesByName];
|
||||
[self MR_setAttributes:attributes forKeysWithDictionary:objectData];
|
||||
|
||||
NSDictionary *relationships = [[self entity] relationshipsByName];
|
||||
[self MR_setRelationships:relationships
|
||||
forKeysWithDictionary:objectData
|
||||
withBlock:^(NSRelationshipDescription *relationshipInfo, id objectData)
|
||||
{
|
||||
NSManagedObject *relatedObject = [self MR_findObjectForRelationship:relationshipInfo
|
||||
withData:objectData];
|
||||
@@ -244,26 +191,17 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
[relatedObject MR_setValuesForKeysWithJSONDictionary:objectData];
|
||||
[relatedObject MR_importValuesForKeysWithDictionary:objectData];
|
||||
}
|
||||
|
||||
[self MR_addObject:relatedObject forRelationship:relationshipInfo];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void) MR_setValuesForKeysWithJSONDictionary:(NSDictionary *)objectData
|
||||
{
|
||||
NSDictionary *attributes = [[self entity] attributesByName];
|
||||
[self MR_setAttributes:attributes forKeysWithDictionary:objectData];
|
||||
|
||||
NSDictionary *relationships = [[self entity] relationshipsByName];
|
||||
[self MR_setRelationships:relationships forKeysWithDictionary:objectData];
|
||||
}
|
||||
|
||||
+ (id) MR_importFromDictionary:(NSDictionary *)objectData inContext:(NSManagedObjectContext *)context;
|
||||
{
|
||||
NSManagedObject *managedObject = [self createInContext:context];
|
||||
[managedObject MR_setValuesForKeysWithJSONDictionary:objectData];
|
||||
[managedObject MR_importValuesForKeysWithDictionary:objectData];
|
||||
return managedObject;
|
||||
}
|
||||
|
||||
@@ -274,10 +212,21 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
|
||||
+ (id) MR_updateFromDictionary:(NSDictionary *)objectData inContext:(NSManagedObjectContext *)context
|
||||
{
|
||||
//find object
|
||||
//create if not exists
|
||||
//apply dictionary updates
|
||||
return nil;
|
||||
NSAttributeDescription *primaryAttribute = [[self entityDescription] MR_primaryKeyAttribute];
|
||||
|
||||
id value = [objectData MR_valueForAttribute:primaryAttribute];
|
||||
|
||||
NSManagedObject *manageObject = [self findFirstByAttribute:[primaryAttribute name] withValue:value inContext:context];
|
||||
if (!manageObject)
|
||||
{
|
||||
manageObject = [self createInContext:context];
|
||||
[manageObject MR_importValuesForKeysWithDictionary:objectData];
|
||||
}
|
||||
else
|
||||
{
|
||||
[manageObject MR_updateValuesForKeysWithDictionary:objectData];
|
||||
}
|
||||
return manageObject;
|
||||
}
|
||||
|
||||
+ (id) MR_updateFromDictionary:(NSDictionary *)objectData
|
||||
@@ -287,7 +236,7 @@ NSUInteger const kMagicalRecordImportMaximumAttributeFailoverDepth = 10;
|
||||
|
||||
+ (NSArray *) MR_importFromArray:(NSArray *)listOfObjectData
|
||||
{
|
||||
return [self MR_importFromArray:listOfObjectData inContext:[NSManagedObjectContext context]];
|
||||
return [self MR_importFromArray:listOfObjectData inContext:[NSManagedObjectContext defaultContext]];
|
||||
}
|
||||
|
||||
+ (NSArray *) MR_importFromArray:(NSArray *)listOfObjectData inContext:(NSManagedObjectContext *)context
|
||||
|
||||
@@ -23,4 +23,9 @@
|
||||
#import "NSManagedObjectModel+MagicalRecord.h"
|
||||
#import "NSPersistentStore+MagicalRecord.h"
|
||||
|
||||
#import "NSManagedObject+MagicalDataImport.h"
|
||||
#import "NSManagedObject+MagicalDataImport.h"
|
||||
#import "NSNumber+MagicalDataImport.h"
|
||||
#import "NSDictionary+MagicalDataImport.h"
|
||||
#import "NSAttributeDescription+MagicalDataImport.h"
|
||||
#import "NSRelationshipDescription+MagicalDataImport.h"
|
||||
#import "NSEntityDescription+MagicalDataImport.h"
|
||||
|
||||
@@ -24,19 +24,27 @@
|
||||
- (void) setupTestData
|
||||
{
|
||||
NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
|
||||
|
||||
|
||||
MappedEntity *related = nil;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
MappedEntity *testMappedEntity = [MappedEntity createInContext:context];
|
||||
testMappedEntity.testMappedEntityIDValue = i;
|
||||
testMappedEntity.sampleAttribute = [NSString stringWithFormat:@"test attribute %d", i];
|
||||
related = testMappedEntity;
|
||||
}
|
||||
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *entity = [SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey createInContext:context];
|
||||
entity.testPrimaryKeyValue = 84;
|
||||
[entity addMappedEntitiesObject:related];
|
||||
|
||||
[context save];
|
||||
}
|
||||
|
||||
- (void) testDataImport
|
||||
{
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *testEntity = (SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *)self.testEntity;
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *testEntity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
assertThat(testEntity.mappedEntities, hasCountOf(4));
|
||||
for (MappedEntity *relatedEntity in testEntity.mappedEntities)
|
||||
@@ -44,7 +52,31 @@
|
||||
assertThat(relatedEntity.sampleAttribute, containsString(@"test attribute"));
|
||||
}
|
||||
|
||||
assertThat([SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(2)));
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(10)));
|
||||
}
|
||||
|
||||
- (void) testDataUpdateWithLookupInfoInDataSet
|
||||
{
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *testEntity = [[self testEntityClass] MR_updateFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
assertThat([SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(10)));
|
||||
|
||||
assertThat(testEntity, is(notNilValue()));
|
||||
assertThat(testEntity.testPrimaryKey, is(equalToInteger(84)));
|
||||
assertThat(testEntity.mappedEntities, hasCountOf(5));
|
||||
}
|
||||
|
||||
- (void) testDataUpdateWithoutLookupData
|
||||
{
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *testEntity =
|
||||
[SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey findFirstByAttribute:@"testPrimaryKey" withValue:[NSNumber numberWithInt:84]];
|
||||
|
||||
assertThat(testEntity, is(notNilValue()));
|
||||
|
||||
[testEntity MR_updateValuesForKeysWithDictionary:self.testEntityData];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"mappedEntities": [1,2,3,4],
|
||||
"sampleAttribute": "Imported from sample json file"
|
||||
"testPrimaryKey": 84
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
@class MappedEntity;
|
||||
|
||||
|
||||
|
||||
@interface SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKeyID : NSManagedObjectID {}
|
||||
@end
|
||||
|
||||
@@ -19,6 +20,18 @@
|
||||
|
||||
|
||||
|
||||
@property (nonatomic, retain) NSNumber *testPrimaryKey;
|
||||
|
||||
|
||||
@property short testPrimaryKeyValue;
|
||||
- (short)testPrimaryKeyValue;
|
||||
- (void)setTestPrimaryKeyValue:(short)value_;
|
||||
|
||||
//- (BOOL)validateTestPrimaryKey:(id*)value_ error:(NSError**)error_;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@property (nonatomic, retain) NSSet* mappedEntities;
|
||||
|
||||
@@ -41,6 +54,15 @@
|
||||
@interface _SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey (CoreDataGeneratedPrimitiveAccessors)
|
||||
|
||||
|
||||
- (NSNumber*)primitiveTestPrimaryKey;
|
||||
- (void)setPrimitiveTestPrimaryKey:(NSNumber*)value;
|
||||
|
||||
- (short)primitiveTestPrimaryKeyValue;
|
||||
- (void)setPrimitiveTestPrimaryKeyValue:(short)value_;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- (NSMutableSet*)primitiveMappedEntities;
|
||||
- (void)setPrimitiveMappedEntities:(NSMutableSet*)value;
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
|
||||
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
|
||||
|
||||
if ([key isEqualToString:@"testPrimaryKeyValue"]) {
|
||||
NSSet *affectingKey = [NSSet setWithObject:@"testPrimaryKey"];
|
||||
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey];
|
||||
}
|
||||
|
||||
return keyPaths;
|
||||
}
|
||||
@@ -36,6 +40,32 @@
|
||||
|
||||
|
||||
|
||||
@dynamic testPrimaryKey;
|
||||
|
||||
|
||||
|
||||
- (short)testPrimaryKeyValue {
|
||||
NSNumber *result = [self testPrimaryKey];
|
||||
return [result shortValue];
|
||||
}
|
||||
|
||||
- (void)setTestPrimaryKeyValue:(short)value_ {
|
||||
[self setTestPrimaryKey:[NSNumber numberWithShort:value_]];
|
||||
}
|
||||
|
||||
- (short)primitiveTestPrimaryKeyValue {
|
||||
NSNumber *result = [self primitiveTestPrimaryKey];
|
||||
return [result shortValue];
|
||||
}
|
||||
|
||||
- (void)setPrimitiveTestPrimaryKeyValue:(short)value_ {
|
||||
[self setPrimitiveTestPrimaryKey:[NSNumber numberWithShort:value_]];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@dynamic mappedEntities;
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
@class MappedEntity;
|
||||
|
||||
|
||||
|
||||
@interface SingleEntityRelatedToMappedEntityUsingDefaultsID : NSManagedObjectID {}
|
||||
@end
|
||||
|
||||
@@ -19,6 +20,18 @@
|
||||
|
||||
|
||||
|
||||
@property (nonatomic, retain) NSNumber *singleEntityRelatedToMappedEntityUsingDefaultsID;
|
||||
|
||||
|
||||
@property short singleEntityRelatedToMappedEntityUsingDefaultsIDValue;
|
||||
- (short)singleEntityRelatedToMappedEntityUsingDefaultsIDValue;
|
||||
- (void)setSingleEntityRelatedToMappedEntityUsingDefaultsIDValue:(short)value_;
|
||||
|
||||
//- (BOOL)validateSingleEntityRelatedToMappedEntityUsingDefaultsID:(id*)value_ error:(NSError**)error_;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@property (nonatomic, retain) MappedEntity* mappedEntity;
|
||||
|
||||
@@ -36,6 +49,15 @@
|
||||
@interface _SingleEntityRelatedToMappedEntityUsingDefaults (CoreDataGeneratedPrimitiveAccessors)
|
||||
|
||||
|
||||
- (NSNumber*)primitiveSingleEntityRelatedToMappedEntityUsingDefaultsID;
|
||||
- (void)setPrimitiveSingleEntityRelatedToMappedEntityUsingDefaultsID:(NSNumber*)value;
|
||||
|
||||
- (short)primitiveSingleEntityRelatedToMappedEntityUsingDefaultsIDValue;
|
||||
- (void)setPrimitiveSingleEntityRelatedToMappedEntityUsingDefaultsIDValue:(short)value_;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- (MappedEntity*)primitiveMappedEntity;
|
||||
- (void)setPrimitiveMappedEntity:(MappedEntity*)value;
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
|
||||
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
|
||||
|
||||
if ([key isEqualToString:@"singleEntityRelatedToMappedEntityUsingDefaultsIDValue"]) {
|
||||
NSSet *affectingKey = [NSSet setWithObject:@"singleEntityRelatedToMappedEntityUsingDefaultsID"];
|
||||
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey];
|
||||
}
|
||||
|
||||
return keyPaths;
|
||||
}
|
||||
@@ -36,6 +40,32 @@
|
||||
|
||||
|
||||
|
||||
@dynamic singleEntityRelatedToMappedEntityUsingDefaultsID;
|
||||
|
||||
|
||||
|
||||
- (short)singleEntityRelatedToMappedEntityUsingDefaultsIDValue {
|
||||
NSNumber *result = [self singleEntityRelatedToMappedEntityUsingDefaultsID];
|
||||
return [result shortValue];
|
||||
}
|
||||
|
||||
- (void)setSingleEntityRelatedToMappedEntityUsingDefaultsIDValue:(short)value_ {
|
||||
[self setSingleEntityRelatedToMappedEntityUsingDefaultsID:[NSNumber numberWithShort:value_]];
|
||||
}
|
||||
|
||||
- (short)primitiveSingleEntityRelatedToMappedEntityUsingDefaultsIDValue {
|
||||
NSNumber *result = [self primitiveSingleEntityRelatedToMappedEntityUsingDefaultsID];
|
||||
return [result shortValue];
|
||||
}
|
||||
|
||||
- (void)setPrimitiveSingleEntityRelatedToMappedEntityUsingDefaultsIDValue:(short)value_ {
|
||||
[self setPrimitiveSingleEntityRelatedToMappedEntityUsingDefaultsID:[NSNumber numberWithShort:value_]];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@dynamic mappedEntity;
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="864" systemVersion="11B26" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="562" systemVersion="11B26" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="AbstractRelatedEntity" representedClassName="AbstractRelatedEntity" isAbstract="YES">
|
||||
<attribute name="sampleBaseAttribute" optional="YES" attributeType="String"/>
|
||||
</entity>
|
||||
@@ -20,15 +20,23 @@
|
||||
<entry key="mappedKeyName" value="id"/>
|
||||
</userInfo>
|
||||
</attribute>
|
||||
<userInfo>
|
||||
<entry key="primaryAttributeKey" value="mapped"/>
|
||||
</userInfo>
|
||||
</entity>
|
||||
<entity name="SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey" representedClassName="SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey">
|
||||
<attribute name="testPrimaryKey" optional="YES" attributeType="Integer 16" defaultValueString="0"/>
|
||||
<relationship name="mappedEntities" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="MappedEntity">
|
||||
<userInfo>
|
||||
<entry key="primaryRelationshipKey" value="testMappedEntityID"/>
|
||||
</userInfo>
|
||||
</relationship>
|
||||
<userInfo>
|
||||
<entry key="primaryAttributeKey" value="testPrimaryKey"/>
|
||||
</userInfo>
|
||||
</entity>
|
||||
<entity name="SingleEntityRelatedToMappedEntityUsingDefaults" representedClassName="SingleEntityRelatedToMappedEntityUsingDefaults">
|
||||
<attribute name="singleEntityRelatedToMappedEntityUsingDefaultsID" optional="YES" attributeType="Integer 16" defaultValueString="0"/>
|
||||
<relationship name="mappedEntity" optional="YES" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MappedEntity"/>
|
||||
</entity>
|
||||
<entity name="SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey" representedClassName="SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey">
|
||||
@@ -99,7 +107,7 @@
|
||||
<element name="EntityWithDiffernentClassName" positionX="-135" positionY="135" width="198" height="45"/>
|
||||
<element name="MappedEntity" positionX="421" positionY="558" width="128" height="105"/>
|
||||
<element name="SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey" positionX="657" positionY="450" width="351" height="60"/>
|
||||
<element name="SingleEntityRelatedToMappedEntityUsingDefaults" positionX="621" positionY="333" width="272" height="60"/>
|
||||
<element name="SingleEntityRelatedToMappedEntityUsingDefaults" positionX="621" positionY="333" width="297" height="75"/>
|
||||
<element name="SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey" positionX="603" positionY="702" width="342" height="60"/>
|
||||
<element name="SingleEntityRelatedToMappedEntityWithNestedMappedAttributes" positionX="664" positionY="597" width="470" height="60"/>
|
||||
<element name="SingleEntityRelatedToMappedEntityWithSecondaryMappings" positionX="-63" positionY="738" width="344" height="75"/>
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
|
||||
- (void) testImportData
|
||||
{
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *entity = (SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *)self.testEntity;
|
||||
SingleEntityRelatedToManyMappedEntitiesUsingMappedPrimaryKey *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
assertThat(entity, is(notNilValue()));
|
||||
assertThat(entity.mappedEntities, hasCountOf(4));
|
||||
|
||||
@@ -29,18 +29,37 @@
|
||||
testMappedEntity.mappedEntityIDValue = 42;
|
||||
testMappedEntity.sampleAttribute = @"This attribute created as part of the test case setup";
|
||||
|
||||
SingleEntityRelatedToMappedEntityUsingDefaults *entity = [SingleEntityRelatedToMappedEntityUsingDefaults createInContext:context];
|
||||
entity.singleEntityRelatedToMappedEntityUsingDefaultsIDValue = 24;
|
||||
|
||||
[context save];
|
||||
}
|
||||
|
||||
- (void) testImportMappedEntityViaToOneRelationship
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingDefaults *entity = (SingleEntityRelatedToMappedEntityUsingDefaults *)self.testEntity;
|
||||
SingleEntityRelatedToMappedEntityUsingDefaults *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
id testRelatedEntity = entity.mappedEntity;
|
||||
|
||||
assertThat(testRelatedEntity, is(notNilValue()));
|
||||
assertThat([testRelatedEntity sampleAttribute], containsString(@"sample json file"));
|
||||
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(2)));
|
||||
}
|
||||
|
||||
- (void) testUpdateMappedEntity
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingDefaults *testEntity =
|
||||
[SingleEntityRelatedToMappedEntityUsingDefaults findFirstByAttribute:@"singleEntityRelatedToMappedEntityUsingDefaultsID" withValue:[NSNumber numberWithInt:24]];
|
||||
|
||||
[testEntity MR_updateValuesForKeysWithDictionary:self.testEntityData];
|
||||
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(1)));
|
||||
|
||||
assertThat(testEntity, is(notNilValue()));
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -34,7 +34,9 @@
|
||||
|
||||
- (void) testImportMappedEntityRelatedViaToOneRelationship
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = (SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *)self.testEntity;
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
id testRelatedEntity = entity.mappedEntity;
|
||||
|
||||
//verify mapping in relationship description userinfo
|
||||
@@ -42,14 +44,55 @@
|
||||
NSRelationshipDescription *testRelationship = [[mappedEntity propertiesByName] valueForKey:@"mappedEntity"];
|
||||
assertThat([[testRelationship userInfo] valueForKey:kMagicalRecordImportRelationshipMapKey], is(equalTo(@"someRandomAttributeName")));
|
||||
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(2)));
|
||||
assertThat(testRelatedEntity, is(notNilValue()));
|
||||
assertThat([testRelatedEntity sampleAttribute], is(containsString(@"sample json file")));
|
||||
}
|
||||
|
||||
- (void) testUpdateMappedEntityRelatedViaToOneRelationship
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = [SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey createEntity];
|
||||
[entity MR_updateValuesForKeysWithDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
id testRelatedEntity = entity.mappedEntity;
|
||||
|
||||
//verify mapping in relationship description userinfo
|
||||
NSEntityDescription *mappedEntity = [entity entity];
|
||||
NSRelationshipDescription *testRelationship = [[mappedEntity propertiesByName] valueForKey:@"mappedEntity"];
|
||||
assertThat([[testRelationship userInfo] valueForKey:kMagicalRecordImportRelationshipMapKey], is(equalTo(@"someRandomAttributeName")));
|
||||
|
||||
assertThat([SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat(testRelatedEntity, is(notNilValue()));
|
||||
assertThat([testRelatedEntity sampleAttribute], is(containsString(@"sample json file")));
|
||||
}
|
||||
|
||||
- (void) testImportMappedEntityUsingPrimaryRelationshipKey
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = (SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *)self.testEntity;
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
id testRelatedEntity = entity.mappedEntity;
|
||||
|
||||
//verify mapping in relationship description userinfo
|
||||
NSEntityDescription *mappedEntity = [entity entity];
|
||||
NSRelationshipDescription *testRelationship = [[mappedEntity propertiesByName] valueForKey:@"mappedEntity"];
|
||||
assertThat([[testRelationship userInfo] valueForKey:kMagicalRecordImportRelationshipPrimaryKey], is(equalTo(@"testMappedEntityID")));
|
||||
|
||||
assertThat([SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey numberOfEntities], is(equalToInteger(1)));
|
||||
assertThat([MappedEntity numberOfEntities], is(equalToInteger(2)));
|
||||
assertThat([testRelatedEntity testMappedEntityID], is(equalToInteger(42)));
|
||||
assertThat([testRelatedEntity sampleAttribute], containsString(@"sample json file"));
|
||||
}
|
||||
|
||||
- (void) testUpdateMappedEntityUsingPrimaryRelationshipKey
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey *entity = [SingleEntityRelatedToMappedEntityUsingMappedPrimaryKey createEntity];
|
||||
[entity MR_updateValuesForKeysWithDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
id testRelatedEntity = entity.mappedEntity;
|
||||
|
||||
//verify mapping in relationship description userinfo
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
|
||||
- (void) testDataImport
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityWithNestedMappedAttributes *entity = (SingleEntityRelatedToMappedEntityWithNestedMappedAttributes *)self.testEntity;
|
||||
SingleEntityRelatedToMappedEntityWithNestedMappedAttributes *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
assertThat(entity.mappedEntity, is(notNilValue()));
|
||||
assertThat(entity.mappedEntity.mappedEntityID, is(equalToInteger(42)));
|
||||
|
||||
@@ -22,8 +22,9 @@
|
||||
|
||||
- (void) testImportMappedAttributeUsingSecondaryMappedKeyName
|
||||
{
|
||||
SingleEntityRelatedToMappedEntityWithSecondaryMappings *entity = (SingleEntityRelatedToMappedEntityWithSecondaryMappings *)self.testEntity;
|
||||
|
||||
SingleEntityRelatedToMappedEntityWithSecondaryMappings *entity = [[self testEntityClass] MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
|
||||
assertThat(entity, is(notNilValue()));
|
||||
assertThat([entity secondaryMappedAttribute], containsString(@"sample json file"));
|
||||
}
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
#import "AbstractRelatedEntity.h"
|
||||
#import "ConcreteRelatedEntity.h"
|
||||
#import "MappedEntity.h"
|
||||
#import "MagicalDataImportTestCase.h"
|
||||
|
||||
@interface ImportSingleRelatedEntityTests : GHTestCase
|
||||
@interface ImportSingleRelatedEntityTests : MagicalDataImportTestCase
|
||||
|
||||
@property (nonatomic, retain) SingleRelatedEntity *testEntity;
|
||||
|
||||
@@ -32,21 +33,28 @@
|
||||
[context save];
|
||||
}
|
||||
|
||||
- (void) setUpClass
|
||||
{
|
||||
[NSManagedObjectModel setDefaultManagedObjectModel:[NSManagedObjectModel managedObjectModelNamed:@"TestModel.momd"]];
|
||||
[MagicalRecordHelpers setupCoreDataStackWithInMemoryStore];
|
||||
|
||||
[self setupTestData];
|
||||
|
||||
id singleEntity = [self dataFromJSONFixture];
|
||||
|
||||
self.testEntity = [SingleRelatedEntity MR_importFromDictionary:singleEntity];
|
||||
}
|
||||
//- (void) setUpClass
|
||||
//{
|
||||
// [NSManagedObjectModel setDefaultManagedObjectModel:[NSManagedObjectModel managedObjectModelNamed:@"TestModel.momd"]];
|
||||
// [MagicalRecordHelpers setupCoreDataStackWithInMemoryStore];
|
||||
//
|
||||
// [self setupTestData];
|
||||
//
|
||||
// id singleEntity = [self dataFromJSONFixture];
|
||||
//
|
||||
// self.testEntity = [SingleRelatedEntity MR_importFromDictionary:singleEntity];
|
||||
//}
|
||||
|
||||
- (void) tearDownClass
|
||||
//- (void) tearDownClass
|
||||
//{
|
||||
// [MagicalRecordHelpers cleanUp];
|
||||
//}
|
||||
|
||||
- (void) setUp
|
||||
{
|
||||
[MagicalRecordHelpers cleanUp];
|
||||
[super setUp];
|
||||
self.testEntity = [SingleRelatedEntity MR_importFromDictionary:self.testEntityData];
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
}
|
||||
|
||||
- (void) testImportAnEntityRelatedToAbstractEntityViaToOneRelationshop
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
@interface MagicalDataImportTestCase : GHTestCase
|
||||
|
||||
@property (nonatomic, retain) NSManagedObject *testEntity;
|
||||
@property (nonatomic, retain) id testEntityData;
|
||||
@property (nonatomic, retain) id testEntity;
|
||||
|
||||
- (Class) testEntityClass;
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
@implementation MagicalDataImportTestCase
|
||||
|
||||
@synthesize testEntityData = testEntityData__;
|
||||
@synthesize testEntity = testEntity__;
|
||||
|
||||
- (void) setUp
|
||||
@@ -22,11 +23,7 @@
|
||||
[self performSelector:@selector(setupTestData)];
|
||||
}
|
||||
|
||||
id singleEntity = [self dataFromJSONFixture];
|
||||
|
||||
self.testEntity = [[self testEntityClass] MR_importFromDictionary:singleEntity];
|
||||
|
||||
[[NSManagedObjectContext defaultContext] save];
|
||||
self.testEntityData = [self dataFromJSONFixture];
|
||||
}
|
||||
|
||||
- (void) tearDown
|
||||
|
||||
Reference in New Issue
Block a user