2013-03-24 43 views
12

Tôi đang sử dụng RestKit 0.20 để phân tích dữ liệu JSON và lưu vào cơ sở dữ liệu. Đây là một thực thể được ánh xạ SchoolClass, được xử lý bởi RestKit và tiết kiệm tiền phạt. Tôi có một thực thể khác có tên là MyClass, nơi lưu trữ các lớp tôi đã chọn. Cái này chỉ là cục bộ trên thiết bị.iOS RestKit không thể lưu thực thể cục bộ vào cơ sở dữ liệu

Đây là đoạn mã để tạo và lưu các thực thể MyClass

NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"]; 

.. set the data for course here 

NSError *executeError = nil; 
if(![managedObjCtx save:&executeError]) { 
     NSLog(@"Failed to save to data store"); 
} 

Dưới đây là đoạn code mà khởi tạo lưu trữ dữ liệu quản lý

// Initialize managed object store 
    NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; 
    objectManager.managedObjectStore = managedObjectStore; 

    /** 
    Complete Core Data stack initialization 
    */ 
    [managedObjectStore createPersistentStoreCoordinator]; 
    NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKMainDb.sqlite"]; 
    NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"]; 
    NSError *error; 
    NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error]; 
    NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error); 

    // Create the managed object contexts 
    [managedObjectStore createManagedObjectContexts]; 

    // Configure a managed object cache to ensure we do not create duplicate objects 
    managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext]; 

Dường như tiết kiệm là thành công và trong MyClasseTableViewController tôi có thể đọc các mục MyClass đã lưu. Tuy nhiên sau khi tôi đóng ứng dụng và khởi động lại. MyClassTableViewController trống, vì các kết quả được tìm nạp trống. Tôi đã mở tệp sqlite bằng cách sử dụng SQLiteBrowser và bảng MyClass trống. Có vẻ như các thực thể MyClass chỉ được lưu trong bộ nhớ cache nhưng không được lưu trong kho lưu trữ liên tục. Tôi có cần phải gọi một số API do RestKit cung cấp để lưu nó không? Tôi đã cố gắng đọc qua tài liệu nhưng không thể tìm thấy nó. Hãy giúp tôi.

+1

Bạn có sử dụng lồng bối cảnh đối tượng được quản lý? Nếu vậy, bạn sẽ cần phải lưu bối cảnh gốc để có được những thay đổi được lưu vào kho dữ liệu –

+0

hi Tom, cảm ơn cho đầu vào.Tôi đã thêm một số mã vào câu hỏi cho thấy cách cửa hàng được tạo ra.Tôi sử dụng lớp RKManagedObjectStore để làm điều đó và luôn nhận được managedObjectContext Có lẽ RestKit đang sử dụng một cái gì đó lồng nhau.Tôi sẽ đào sâu hơn theo dẫn của bạn.Cảm ơn – Ray

Trả lời

24

Cảm ơn đã dẫn đầu bởi Tom, tôi thấy rằng RestKit có NSManagedObjectContext (RKAdditions), trong đó có một phương pháp:

- (BOOL)saveToPersistentStore:(NSError **)error 

Có nó có logic để xử lý lồng quản lý bối cảnh đối tượng. Đây là mã mới mà làm việc, chỉ cần một sự thay đổi dòng, nhưng mất rất nhiều thời gian để tìm cuộc gọi ngay :(

#import "NSManagedObjectContext+RKAdditions.h" 
    NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
    MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"]; 

    .. set the data for course here 

    NSError *executeError = nil; 
    if(![managedObjCtx saveToPersistentStore:&executeError]) { 
      NSLog(@"Failed to save to data store"); 
    } 
+0

mát mẻ .. cảm ơn bạn đã làm rõ – JAHelia

+0

THANK YOU SO MUCH !!!! :(rất nhiều thời gian tìm kiếm ở khắp mọi nơi cho điều này! Cảm ơn bạn cảm ơn bạn !!! – crojassoto

+0

THANK YOU. đã sử dụng khung trong một thời gian dài nhưng vẫn quên điều này. lol –

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