我如何使用蓝牙传输核心数据实体与其相应的关系?我有三个核心数据实体设置了反向关系,它们都运行良好,但我需要根据它不在另一个iPhone上的核心数据实体集中的相应表中的上下文将这些转移到另一个iPhone。我知道如何通过蓝牙传输简单的东西,如字符串和整数,但这是一个全新的水平,我只在4个月前开始为iPhone编程。感谢您的专家帮助!
编辑:
谢谢,但由于某种原因,我一直收到这个错误!我该怎么办?
2010-02-12 21:24:14.907 PitScout[92918:207] Failed to call designated initializer on NSManagedObject class 'Team'
2010-02-12 21:24:14.907 PitScout[92918:207] *** -[Team setTeamNumber:]: unrecognized selector sent to instance 0x112b630
2010-02-12 21:24:14.908 PitScout[92918:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Team setTeamNumber:]: unrecognized selector sent to instance 0x112b630'
感谢。
答案 0 :(得分:2)
您需要以某种方式序列化对象以进行传输,然后重新插入到另一侧的上下文中。我建议您查看NSCoding
协议和示例,以便您使用NSKeyedArchiver
和NSKeyedUnarchiver
将对象序列化为NSData
进行传输(或将base64编码为{{} 1}}如有必要)。
首先确保您的模型对象实现了NSCoding:
NSString
然后在模型对象中实现以下方法来处理对象的编码和解码:
@interface MyObject : NSManagedObject <NSCoding>
使用-(id)initWithCoder:(NSCoder*)coder
{
if (self = [self init])
{
self.myProperty = [coder decodeObjectForKey:@"myProperty"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.message forKey:@"myProperty"];
}
将对象序列化为NSKeyedArchiver
:
NSData
使用NSKeyedUnarchiver反序列化:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myObject];
如果需要字符串,那么您必须对MyObject *myObject = (MyObject *)[NSKeyedUnarchiver unarchiveObjectWithData:myData];
进行base64编码和解码,有关详细信息,请参阅此帖子:How do I do base64 encoding on iphone-sdk?
答案 1 :(得分:2)
尝试序列化NSManagedObject
个实例会失败,因为它们直接与它们来自的NSManagedObjectContext
绑定。
您需要将它们转换为另一个数据结构然后传输它们。 JSON和XML都非常适用于此,因为您可以使用KVC将数据从NSManagedObject
和NSDictionary
中取出,然后可以轻松地将其转换为中间格式。
一旦您将它们置于中间格式并通过电线发送,您就可以轻松地将它们重建到目的地NSManagedObjectContext
而不会出现问题。
答案 2 :(得分:1)
这可能是过度杀戮但是一种尚未失败的方法是SLIP,RFC 1055 1988版。多年来,我一直使用它将数据块映射到7或8位ASCII流,以便在我遇到的每种媒体上传输。然后使用它的反向或一些修改将流转换回另一端所需的配置。 C中的代码示例在RFC中。我总是使用Phil Karn的建议,在数据包的开始和结束时都使用相同的字符。
这样只需要一个例程来处理流。它会吞噬字符,直到遇到SOP / EOP。这被选择用于处理在无线电链路的输入上累积的噪声,因为它们等待数据闲置。菲尔在其他着作中提到了这一点。
我通常使用\ x0D或\ x0A,调试工具运行的系统用作回车符,并使用常用的反斜杠'\'作为转义字符。现在,使用另一个控制代码或使用控制字符的不同值来减少数据包大小是很方便的。系统的使用允许终端程序添加SLIP代码,并进行一些修改以充当监视器和手动将数据包输入流中的工具。
如果数据包中的第一个字符指示另一端的选项,我总是发现我有足够的选项。当然,必须提供某种形式的错误检查和/或错误恢复以及重新发送MUNGED数据包的能力。对于通过高度可靠的链路发送的小数据包,可能会进行简单的校验和,或者在使用三个矿化火山作为天线站点的传输中,比一个人想要高度重新发布的Fowarad误差校正算法更适合在家中使用。
SLIP的通用性足以从16位Motorola 68HC11获取数据并在32位Intel系统上重建它,如果编程器反转结束并处理16和16之间的偏移。 32位数据。
戈登
戈登库格 斯蒂尔沃特,好的