2009-10-28 29 views
12

Tôi đang tạo một Ứng dụng iPhone và tự hỏi liệu Dữ liệu cốt lõi có tốt hơn cho dữ liệu chỉ đọc hơn cơ sở dữ liệu SQLite hay không. Có vẻ như DB SQLite là lựa chọn tốt hơn, đúng không? Tôi có thể nạp tiền vào kho dữ liệu Core được không?Dữ liệu cốt lõi có hữu ích cho dữ liệu chỉ đọc không?

Về cơ bản, tôi cần 3 bảng với một nhóm (tối đa 3000) đối tượng mỗi nhóm. Sau đó tôi muốn liệt kê dữ liệu trong TableViews, tìm kiếm trên đó hoặc tải những thứ cho các mục đích khác.

Tôi có nên sử dụng Dữ liệu cốt lõi trong trường hợp này không?

Trả lời

13

Nếu bạn sẽ hiển thị dữ liệu chỉ đọc của mình trong chế độ xem bảng, có thể có lợi thế đáng kể khi sử dụng Dữ liệu cốt lõi qua SQLite do NSFetchedResultsController. Lớp tiện lợi này làm cho nó rất dễ dàng để hiển thị các phần tử cơ sở dữ liệu trong một khung nhìn bảng và nó có thể xử lý việc tìm nạp theo đợt cho bạn. Việc tìm nạp theo đợt cho phép bạn chỉ tải thông tin bạn cần trên màn hình ngay sau đó, cải thiện đáng kể thời gian tải và mức sử dụng bộ nhớ cho tất cả trừ các tập dữ liệu nhỏ nhất.

Tôi sử dụng Dữ liệu cốt lõi cho thông tin chỉ đọc mà tôi gửi trong gói ứng dụng vì lý do này, cùng với thực tế là tôi có thể chia sẻ mô hình dữ liệu với cơ sở dữ liệu có thể ghi được lưu trữ trong dữ liệu ứng dụng của người dùng. Đề nghị của tôi là đi với Core Data, trừ khi bạn hoàn toàn cần phải nhắm mục tiêu các thiết bị iPhone 2.x.

-8

Dữ liệu chính sử dụng SQLite (trong số các tùy chọn khác), do đó câu hỏi của bạn có phần không hoàn thiện.

+4

Tôi sẽ không coi đó là một câu hỏi thiếu sót. Trong khi CoreData sử dụng SQLite cho * lưu trữ cơ bản *, bạn không có bất kỳ giao diện nào với chính SQLite. Thay vào đó, sức mạnh của CoreData xuất phát từ các lớp và phương thức của nó. Ví dụ, 'NSFetchedResultsController' khi được sử dụng với' UITableView' sẽ giúp đọc dữ liệu một cách hiệu quả từ đĩa vì nó cần thiết và quản lý bộ nhớ cho phù hợp. Về cơ bản, bạn còn lại để tự làm điều này nếu bạn sử dụng SQLite thẳng. – jbrennan

+0

API SQLite đi đâu khi bạn sử dụng Dữ liệu chính? Theo như tôi có thể nói, nó vẫn còn đó. –

+1

Tôi không quan tâm liệu tôi có thể truy cập cả hai cùng một lúc (có thể là một ý tưởng tồi khi có Dữ liệu cốt lõi quản lý đối tượng của bạn). Tôi muốn sử dụng một và cần phải biết cái nào là tốt nhất. – Christian

2

Bạn chắc chắn có thể lưu trữ một kho dữ liệu Core được điền sẵn trong ứng dụng của bạn, giống như bạn có thể điền sẵn cơ sở dữ liệu SQLite hoặc plist lớn với tất cả dữ liệu của bạn (mặc dù trường hợp này), hoặc bất cứ điều gì.

Dữ liệu cốt lõi là tốt đẹp vì đó là tất cả các ca cao gốc, nó xử lý tất cả tải từ DB vào đối tượng bản địa, nó đã được tối ưu hóa tàn nhẫn, và như vậy. Nhưng cũng có rất nhiều mã ở đó để làm những thứ mà bạn không quan tâm: xử lý sửa đổi, lưu thay đổi, hoàn tác và làm lại hỗ trợ, v.v. Vì vậy, không có câu trả lời rõ ràng nào theo cách này hay cách khác.

Rất nhiều tùy thuộc vào mức độ thoải mái của bạn với cả Dữ liệu cốt lõi và các lựa chọn thay thế. Bạn có hài lòng khi giao dịch với API SQLite (hoặc một trong số nhiều Cocoa wrappers) để lấy dữ liệu của bạn không? Nếu vậy, thì điều đó có thể đơn giản hơn. Nếu có Dữ liệu cốt lõi làm ORM cho bạn sẽ là một chiến thắng lớn, sau đó đi theo cách đó. Mặt khác, các truy vấn phức tạp với dữ liệu lõi sử dụng các API vị ngữ, có thể phức tạp hơn việc sử dụng SQL rỗng với SQLite. Đó là một cách nghĩ.

+0

Tôi đã thêm thông tin có thể lên đến 3000 bản ghi ở một trong các bảng. Nếu tôi dễ dàng tự quyết định, tôi sẽ không phải hỏi ở đây. Nhưng biết rằng không có bất lợi lớn giúp. – Christian

2

Tùy thuộc vào mức độ quan hệ của chúng, bạn có thể nên đọc dữ liệu chỉ đọc từ plist. Plist là dễ dàng để tải/lưu (họ biến thành NSDictionaries) và có lẽ dễ dàng hơn để chỉnh sửa

+0

Ah, đã không nghĩ về điều đó. Chúng có quan hệ. Nó giống như "một trạm thuộc về một con đường thuộc về phương tiện vận chuyển". Đó không phải là tối ưu cho plists, phải không? – Christian

+0

Tùy thuộc. Nó có phân cấp nghiêm ngặt, hoặc có nhiều mối quan hệ không? Một plist hiện các cựu chỉ tốt, nhưng sau này là khó khăn hơn. –

+0

Vâng, có mối quan hệ nhiều-nhiều. Vì vậy, tôi tốt hơn không đi với plists. Cảm ơn rất nhiều! – Christian

10

Dưới đây là một cách đơn giản để tải trước kho lưu trữ dữ liệu lõi bằng cách sử dụng lệnh ghép.

Tạo danh sách thuộc tính chứa một loạt từ điển. Làm cho các phím của mỗi từ điển tương ứng với các phím của đối tượng được quản lý của bạn.

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

Sau đó, gọi phương pháp này lần đầu tiên ứng dụng khởi chạy:

- (void)loadDataFromPropertyList { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"]; 
    NSArray *items = [NSArray arrayWithContentsOfFile:path]; 

    NSManagedObjectContext *ctx = self.managedObjectContext; 

    for (NSDictionary *dict in items) { 
     NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx]; 
     [m setValuesForKeysWithDictionary:dict]; 
    } 

    NSError *err = nil; 
    [ctx save:&err]; 

    if (err != nil) { 
     NSLog(@"error saving managed object context: %@", err); 
    } 
} 

Gọi loadDataFromPropertyList lần đầu tiên ứng dụng khởi chạy bằng cách bao gồm các mã sau đây trong việc thực hiện application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if (![defaults objectForKey:@"firstRun"]) 
{ 
    [defaults setObject:[NSDate date] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadDataFromPropertyList]; 
} 
Các vấn đề liên quan