2010-10-11 39 views
10

Tôi đang gặp một số vấn đề về răng cưa với coredata, nhưng cảm thấy nó sẽ làm rõ mọi thứ cho tôi nếu ai đó có thể giải thích một số trường hợp đơn giản với tôi.Làm thế nào để lưu trữ CGRect và những thứ khác trong dữ liệu chính

Tôi muốn đặt mô hình của mình vào coredata và tại một trường hợp đơn giản nhất tận dụng lợi thế của việc hoàn tác/làm lại. Thing là, tất cả các ví dụ tôi thấy có xu hướng lưu trữ hoặc chuỗi hoặc số nguyên. Nếu tôi có một lớp như sau mà tôi muốn thực hiện trong dữ liệu cốt lõi (một tạo thành ví dụ):

@interface Badge : NSObject { 

NSString *textForBadge; 
int  badgeValue; 
UIColor *color; 
CGRect rect; 
NSMutableArray *awards; // this would be a list of 'Category' - another custom class 
} 

Đây là tất cả tạo thành ngay tại chỗ, nhưng mỗi làm nổi bật một sự nhầm lẫn

Như tôi đã thấy, tôi sẽ mở tệp .xcdatamodel và thêm một đối tượng mới được tạo 'Huy hiệu', đây sẽ là NSManagedObject. Sau đó, tôi thêm thuộc tính cho textForBadge thuộc loại String. Càng xa càng tốt. Tôi làm một cái gì đó tương tự cho badgeValue, nhưng sau đó đến các UIColorCGRect và tôi là một chút stumped, vì không có một tài sản cho những người. Tôi có phải tạo một thực thể để đại diện cho mỗi thực thể (tức là một thực thể Rect có bốn thuộc tính x,y,w,h) là ints? Sau đó, cư một CGRect với những ints mỗi lần? Ditto cho UIColor?

Cuối cùng, tôi truy cập danh sách của mình là awards. Nếu đây là danh sách các con trỏ tới một số đối tượng đại diện cho giải thưởng, chúng có thể chứa hình ảnh, màu sắc, văn bản, v.v. Tôi giả định rằng award một lần nữa sẽ là một thực thể tôi phải thiết kế và thay vì Badge mối quan hệ 1 đến nhiều từ nó đến lớp Award.

Tôi có nhận được bất kỳ quyền nào trong số này hoặc đi theo hướng ngược lại cạnh tranh không? Tất cả các ví dụ tôi thấy hoạt động trên các đối tượng vani như String hoặc int vì vậy muốn chắc chắn rằng tôi có quyền này trong đầu của tôi trước khi thực hiện một loạt các công cụ.

Trân trọng!

Bryn

Trả lời

5

Đây là tài liệu có liên quan: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html nhưng về cơ bản, bạn phải cung cấp một cách cho Core dữ liệu để dịch giữa các thuộc tính phi tiêu chuẩn của bạn và mọi thứ nó có thể cửa hàng. Có hai cách để làm điều đó. Sử dụng các thuộc tính có thể biến đổi và biến thế giá trị hoặc sử dụng các thuộc tính tạm thời và thực hiện chuyển đổi chỉ khi bối cảnh đối tượng được quản lý sẽ được lưu.

Tôi nghĩ rằng trong hầu hết các trường hợp, những gì bạn mô tả (xác định các thực thể tùy chỉnh để lưu trữ các thành phần của một thứ gì đó giống như CGRect) là quá mức cần thiết.

+1

Liên kết bạn tham chiếu ở đây đã chết. @AndrewMadsen –

22

Cụ thể về CGRect bạn có thể sử dụng NSStringFromCGRect lưu trữ CGRect làm NSString. Sau đó sử dụng CGRectFromString để chuyển đổi nó trở lại:

CGRect rect = CGRectMake(5, 5, 40, 30); 
NSString* rectAsString = NSStringFromCGRect(rect); 
CGRect original = CGRectFromString(rectAsString); 

này cho phép bạn dễ dàng lưu trữ nó trong một NSManagedObject. Sau đó bạn có thể thêm một accessor tùy chỉnh trong việc thực hiện của bạn để chuyển đổi nó:

- (CGRect)realRect { 
    return CGRectFromString(self.rectAsString); 
} 
+0

Điều này thật tuyệt! Cảm ơn –

9

Bạn phải cẩn thận nếu bạn sử dụng serialization NSStringFromCGRect đề xuất bởi aegzorz. Điều này không hoạt động đáng tin cậy đối với các số lớn được viết tắt trong biểu diễn NSString.

Ví dụ, mã này

CGRect test1 = CGRectMake(CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX); 
NSString* test1Str = NSStringFromCGRect(test1); 
CGRect test2 = CGRectFromString(test1Str); 
NSLog(@"test1: %f %f %f %f", test1.origin.x - CGFLOAT_MAX, test1.origin.y - CGFLOAT_MAX, test1.size.width - CGFLOAT_MAX, test1.size.height - CGFLOAT_MAX); 
NSLog(@"test2: %f %f %f %f", test2.origin.x - CGFLOAT_MAX, test2.origin.y - CGFLOAT_MAX, test2.size.width - CGFLOAT_MAX, test2.size.height - CGFLOAT_MAX); 

chí đầu ra

test1: 0.000000 0.000000 0.000000 0.000000 
test2: -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 

Theo tôi nó tốt hơn để lưu trữ các bốn giá trị riêng biệt.

16

Lưu trữ đối tượng và cơ cấu UIColor như CGRect trong Core Data là khá dễ dàng (điều này có thể mới kể từ khi OP hỏi về nó):

Xác định các đối tượng như năng biến trong mô hình của bạn:

snapshot of Core Data model

Trong lớp NSManagedObject xác định và sử dụng UIColor đối tượng bình thường:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Bọc CGRect str uctures trong một đối tượng NSValue:

@property (nonatomic, retain) NSValue *imageRect; 

CGRect imageRect = [self.imageRect CGRectValue]; 
imageRect.size.width = 100; 
self.imageRect = [NSValue valueWithCGRect:imageRect]; 
+0

Đây là cách được khuyến nghị để thực hiện loại công cụ này – Jack

Các vấn đề liên quan