我在CoreData模型中有两个实体(产品和图像),产品之间有一对多的关系(一)-images(多)。我还对实体进行了子类化,并试图从json文件中填充数据库;但是,我似乎无法理解如何将图像插入到与产品相关的图像中,因此当我在应用程序中选择该产品时,就会得到所有相关的图像。
extension Products {
@NSManaged var price: NSNumber?
@NSManaged var stock: NSNumber?
@NSManaged var desc: String?
@NSManaged var name: String?
@NSManaged var images: NSSet?
@NSManaged var sales: NSSet?
}
extension Images {
@NSManaged var image: String?
@NSManaged var products: Products?
}然后,json文件数据(我对用NSJSONObjectWithData序列化它没有任何问题):
{“记录”:[{“名称”:"Apple iMac 27in",“描述”:“令人震惊的全合一iMac功能包括一个漂亮的27英寸Retina 5K宽屏显示器、英特尔四核核心i5处理器和带有2GB GDDR5内存的AMD Radeon R9 M380图形处理器。”,“图像”:"imac1.jpg","imac2.jpg",“股票”:32,“价格”:1699.00 },{“名称”:"Apple iPhone 6s Plus 128 GB","description“:”当您使用iPhone 6s Plus时,您知道您从未有过这样的感觉。只要一次按压,3D触控就能让你做得比以往任何时候都多。实时照片以一种强有力的生动的方式将你的记忆带入生活。这只是个开始。深入观察iPhone 6s Plus,您将发现各个层次的创新。“、”图像“:"iphone6splus1.jpg”、"iphone6splus2.jpg“、"iphone6splus3.jpg”、"iphone6splus4.jpg“、”股票“:144、”价格“:1042.00 }}
这是在检查数据库是否为空之后,我使用的函数,用于填充AppDelegate中的数据库。
func fillDatabase() {
let jsonURL = NSBundle.mainBundle().URLForResource("products", withExtension: "json");
let data = NSData(contentsOfURL: jsonURL!);
do {
let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0)) as! Dictionary<String, AnyObject>;
let recordset = jsonData["records"] as! Array<Dictionary<String, AnyObject>>;
for record in recordset {
let product = Products(context: managedObjectContext);
if let name = record["name"] {
product.name = name as? String;
}
if let stock = record["stock"] as? NSNumber {
product.stock = stock;
}
if let price = record["price"] as? Double {
product.price = price;
}
if let desc = record["description"] as? String {
product.desc = desc;
}
if let images = record["image"] as? NSMutableArray {
// *********************************************************
// Im getting the array of images, but dont know where to go from here.
}
do {
try managedObjectContext.save();
} catch let error as NSError {
print(error.debugDescription);
}
}
} catch let error as NSError {
print("error parsing json object: \(error.debugDescription)");
return;
}
}发布于 2016-03-03 21:07:19
如果您在Core数据中正确地设置了关系,那么您应该能够通过使用以下内容来关联这些图像:
product.images = NSSet(array: imageArray)确保imageArray变量包含Images类型的对象。
总之,首先需要解析数组并从该数组创建Images产品:
var imageArray = [Images]()
for yourRawImageFromJSON in json{
let image1 = Images(context: managedObjectContext)
// set properties on image
yourImages.append(image1)
}然后,一旦您拥有了这个Images数组,就按照我前面所说的那样做(为了完整起见,再次在这里添加它):
product.images = NSSet(array: imageArray)边注
您应该遵循类以单数格式命名的一般规则,因此不应该使用Images和Products作为类名,而应该使用Image和Product__。即使一个类代表一个通用的概念(就像数据库系统中的概念类被命名为复数),使用单一形式更常见和更方便(例如,使用let product = Product()比使用let product = Products()更简洁,因为后者传递的概念是要实例化多个实例,尽管情况显然并非如此)。
发布于 2016-03-03 21:57:00
我并不像在我的项目中那样使用CoreData,但是如果您的代码的其他部分按预期工作,这应该可以完成任务。
if let images = record["image"] as? NSMutableArray {
for i in 0..<images.count {
let imageObject = Images(context: managedObjectContext)
imageObject.image = images[i]
let images = product.mutableSetValueForKey("images")
images.addObject(imageObject)
}
}关于CoreData对象的命名,我同意@the_critic,您实际上有图像对象和产品对象。您的产品对象有多个图像对象。这意味着在数据模型中将对象的名称设置为“图像”和关系“图像”的名称可能会更好。
发布于 2016-03-03 23:12:48
在核心数据中存储数组并不是一个好做法,因此,我将这样做:
首先:您需要创建一个Image对象。
extension Images { /* Images+Methods */
class func save(images: [NSDictionary]) -> [Images]? {
let imagesArray = [Images]()
for imageObject in images {
// creates a new Images NSManagedObject
guard let imageEntity = NSEntityDescription.insertNewObjectForEntityForName("Images", inManagedObjectContext: managedObjectContext) as? Images else {
return nil
}
if let image = imageObject["image"] as? String {
imageEntity.image = image
imagesArray.append(imageEntity)
}
}
return imagesArray
}然后,从前面的方法调用Save(图像: NSDictionary)方法。
if let images = record["image"] as? NSMutableArray {
// after what you already have, add the following line
if let images = record["images"] as? NSMutableArray, let imagesObjectArray = Images.save(images) {
product.images = NSSet(array:imagesObjectArray)
}
}这样就行了。因为它是为您拥有的每一个图像创建一个图像NSManagedObject。
希望这能有所帮助
你真的需要改变你的类名。
https://stackoverflow.com/questions/35782966
复制相似问题