我在CoreData模型(产品和图像)中有两个实体,产品之间存在一对多的关系(一个) - 图像(很多)。我还将我的实体子类化,我试图从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序列化它:
{“records”:[{ “名称”:“Apple iMac 27in”, “描述”:“令人惊叹的一体化iMac采用漂亮的27英寸Retina 5K宽屏显示器,四核英特尔酷睿i5处理器和AMD Radeon R9 M380图形处理器,配备2GB GDDR5显存。”, “image”:[“imac1.jpg”,“imac2.jpg”], “股票”:32, “价格”:1699.00 }, { “名称”:“Apple iPhone 6s Plus 128 GB”, “描述”:“你使用iPhone 6s Plus的那一刻,你知道你从来没有感觉到它。只需一次按下,3D Touch让你比以往任何时候都做得更多。现场照片让你的回忆充满活力生动的方式。这只是一个开始。深入了解iPhone 6s Plus,您将在各个层面找到创新。“, “image”:[“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;
}
}
答案 0 :(得分:1)
鉴于您在Core Data中正确设置了关系,您应该可以使用以下内容关联图像:
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()
,因为后者传达了您实例化多个实例的概念,即使事实并非如此)
答案 1 :(得分:0)
我没有像你在我的项目中那样使用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,你实际上有图像对象和产品对象。并且您的产品对象具有多个图像对象。这意味着制作对象的名称&#34; image&#34;和关系的名称&#34;图像&#34;在您的数据模型中可能会好得多。
答案 2 :(得分:0)
将数组存储在核心数据中不是一个好习惯,因此,我会这样做:
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
}
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。
希望这有帮助
P.S 你真的需要改变你的班级名称。