iphone - JSON و Core Data على iPhone




4 Answers

أولاً ، اختر مكتبة JSON لاستخدامها ، فأنا شخصياً أحب TouchJSON ولكن هناك العديد من الآخرين هناك لطيفة جدًا أيضًا. الجزء المعقد ، بالرغم من أنه ليس بجد ، هو تحويل الكائنات المدارة إلى هياكل مناسبة للتحويل. كتبت هذا سريع حقيقي لذلك قد يكون خطأ أو اثنين :)

الطرق التي تتصل بها هي:

- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects;
- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc;

والتنفيذ كما يلي:

- (NSDictionary*)dataStructureFromManagedObject:(NSManagedObject*)managedObject
{
  NSDictionary *attributesByName = [[managedObject entity] attributesByName];
  NSDictionary *relationshipsByName = [[managedObject entity] relationshipsByName];
  NSMutableDictionary *valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];
  [valuesDictionary setObject:[[managedObject entity] name] forKey:@"ManagedObjectName"];
  for (NSString *relationshipName in [relationshipsByName allKeys]) {
    NSRelationshipDescription *description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];
    if (![description isToMany]) {
      NSManagedObject *relationshipObject = [managedObject valueForKey:relationshipName];
      [valuesDictionary setObject:[self dataStructureForManagedObject:relationshipObject] forKey:relationshipName];
      continue;
    }
    NSSet *relationshipObjects = [managedObject objectForKey:relationshipName];
    NSMutableArray *relationshipArray = [[NSMutableArray alloc] init];
    for (NSManagedObject *relationshipObject in relationshipObjects) {
      [relationshipArray addObject:[self dataStructureForManagedObject:relationshipObject]];
    }
    [valuesDictionary setObject:relationshipArray forKey:relationshipName];
  }
  return [valuesDictionary autorelease];
}

- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects
{
  NSMutableArray *dataArray = [[NSMutableArray alloc] init];
  for (NSManagedObject *managedObject in managedObjects) {
    [dataArray addObject:[self dataStructureForManagedObject:managedObject]];
  }
  return [dataArray autorelease];
}

- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects
{
  NSArray *objectsArray = [self dataStructuresFromManagedObjects:managedObjects];
  NSString *jsonString = [[CJSONSerializer serializer] serializeArray:objectsArray];
  return jsonString;
}

- (NSManagedObject*)managedObjectFromStructure:(NSDictionary*)structureDictionary withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSString *objectName = [structureDictionary objectForKey:@"ManagedObjectName"];
  NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:objectName inManagedObjectContext:moc];
  [managedObject setValuesForKeysWithDictionary:structureDictionary];

  for (NSString *relationshipName in [[[managedObject entity] relationshipsByName] allKeys]) {
    NSRelationshipDescription *description = [relationshipsByName objectForKey:relationshipName];
    if (![description isToMany]) {
      NSDictionary *childStructureDictionary = [structureDictionary objectForKey:relationshipName];
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [managedObject setObject:childObject forKey:relationshipName];
      continue;
    }
    NSMutableSet *relationshipSet = [managedObject mutableSetForKey:relationshipName];
    NSArray *relationshipArray = [structureDictionary objectForKey:relationshipName];
    for (NSDictionary *childStructureDictionary in relationshipArray) {
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [relationshipSet addObject:childObject];
    }
  }
  return managedObject;
}

- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSError *error = nil;
  NSArray *structureArray = [[CJSONDeserializer deserializer] deserializeAsArray:json error:&error];
  NSAssert2(error == nil, @"Failed to deserialize\n%@\n%@", [error localizedDescription], json);
  NSMutableArray *objectArray = [[NSMutableArray alloc] init];
  for (NSDictionary *structureDictionary in structureArray) {
    [objectArray addObject:[self managedObjectFromStructure:structureDictionary withManagedObjectContext:moc]];
  }
  return [objectArray autorelease];
}

الآن هذا متكرّر ، لذا يمكنك بسهولة إنهاء ترجمة متجرك الكامل إذا لم تكن حذراً. راقب علاقاتك وتأكد من أنها تذهب فقط "لأسفل" شجرة الكائن بحيث تحصل فقط على الأشياء التي تريد ترجمتها.

لدي رسم بياني أساسي لبيانات البيانات (يتكون من كيانين مرتبطين بعلاقة متعددة الأطراف).

لقد كنت فضولياً ، كمطور مطور لجهاز iPhone لا يمتلك الخبرة الكافية ، وما إذا كان أي شخص يمكنه التوصية بنهج ، وتطبيق JSON مناسب لجهاز iPhone ، مما يسمح لي بما يلي:

  1. تحويل سجلات البيانات الأساسية إلى سلسلة JSON (مع الحفاظ على العلاقة بين الكيانات) ؛ و

  2. تحويل سلسلة JSON مرة أخرى إلى كائنات البيانات الأساسية (مرة أخرى الحفاظ على العلاقة بين الكيانات).

لقد بحثت ، دون جدوى ، عن عينة تعليمي / رمز على هذه النقطة حتى أي مساعدة سيتم تلقي بامتنان.




تزامن البيانات الأساسية مع Rails هو عرض تقديمي مفصل يتضمن نموذج التعليمة البرمجية لإجراء تسلسل / إلغاء تسلسل كائنات البيانات الأساسية إلى / من JSON (انتقل إلى الشريحة 55 للحصول على جزء البيانات الأساسية). يفترض نموذج شفرته نموذجًا بسيطًا إلى حد ما بدون علاقات ، على الرغم من أنني أعتقد أنه سيكون من السهل جدًا توسيعه.

كما يتناول العرض التقديمي أيضًا بعض التفاصيل حول الحفاظ على مزامنة نموذج البيانات الأساسية مع تطبيق ويب يستند إلى REST ، مع مؤشرات لبعض المكتبات المفيدة ، بما في ذلك ObjectiveResource و ASIHTTPRequest . لست متأكدًا مما إذا كان هذا هو ما تحاول القيام به ، ولكنه يستحق البحث حتى بالنسبة لرمز البيانات الأساسية.







فكرنا فقط في نشر تحديث سريع لهذا السؤال. تابعت الإجابات التي كتبها ماركوس وبراندون وخرجت مع هذا للتصدير JSON (يستخدم TouchJSON لا يزال):

- (NSData*)jsonStructureFromManagedObjects:(NSArray*)managedObjects
{
    NSArray *objectsArray = [self dataStructuresFromManagedObjects:managedObjects];
    NSData *jsonData      = [[CJSONSerializer serializer] serializeArray:objectsArray error:nil];
    return jsonData;
}

- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects
{
    NSMutableArray *dataArray = [[NSMutableArray alloc] init];
    for (NSManagedObject *managedObject in managedObjects) {
        [dataArray addObject:[self dataStructureFromManagedObject:managedObject]];
    }
    return dataArray;
}

- (NSDictionary*)dataStructureFromManagedObject:(NSManagedObject*)managedObject
{
    NSDictionary *attributesByName        = [[managedObject entity] attributesByName];
    NSDictionary *relationshipsByName     = [[managedObject entity] relationshipsByName];
    NSMutableDictionary *valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];
    [valuesDictionary setObject:[[managedObject entity] name] forKey:@"ManagedObjectName"];

    for (NSString *relationshipName in [relationshipsByName allKeys]) {

        NSRelationshipDescription *description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];

        if ([[[description userInfo] objectForKey:@"isExportable"] boolValue] == YES) {

            if (![description isToMany]) {
                NSManagedObject *relationshipObject = [managedObject valueForKey:relationshipName];
                if (relationshipObject) {
                    [valuesDictionary setObject:[self dataStructureFromManagedObject:relationshipObject] forKey:relationshipName];
                }

                continue;
            }

            NSSet *relationshipObjects        = [managedObject valueForKey:relationshipName];
            NSMutableArray *relationshipArray = [[NSMutableArray alloc] init];

            for (NSManagedObject *relationshipObject in relationshipObjects) {
                [relationshipArray addObject:[self dataStructureFromManagedObject:relationshipObject]];
            }

            [valuesDictionary setObject:relationshipArray forKey:relationshipName];

        }

    }
    return valuesDictionary;
}

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




Related

iphone objective-c json core-data