2012-06-20 27 views
10

मेरे पास एक ऐप है जो MagicalRecord का उपयोग करता है, और मैं संदर्भ के लिए उपयोग की जाने वाली बड़ी मात्रा में डेटा के साथ डेटाबेस को पूर्व-पॉप्युलेट कर रहा हूं। उसी डेटा मॉडल के भीतर, मेरे पास ऐप में जो कुछ भी हो सकता है उससे संबंधित उपयोगकर्ता-परिभाषित जानकारी है।जादुई रिकॉर्ड: एकाधिक डेटाबेस

ऐप को अस्वीकार कर दिया गया था क्योंकि पूर्व-जनसंख्या वाले डेटा को "बैकअप नहीं" के रूप में चिह्नित किया जाना चाहिए। इसलिए, मैं उस डेटा को एक अलग डेटास्टोर में रखना चाहता हूं ताकि मैं उपयोगकर्ता डेटा को बैकअप के रूप में रख सकूं।

क्या मैजिकल रेकॉर्ड का उपयोग करके दो अलग डेटास्टोर रखने का कोई तरीका है?

उत्तर

15

मुझे लगता है कि यह संभव है, लेकिन बहुत आसान नहीं है। जैसा कि आप जानते हैं, एक से अधिक डेटाबेस के साथ काम करने के लिए, आपको अपने PersistentStoreCoordinator में कुछ बदलाव लाएंगे, इसलिए इसमें दो PersistentStores होंगे। इसके बाद, आप कोर डेटा स्टैक इस तरह दिखेगा: enter image description here

दूसरा तरीका दो अलग-अलग PersistentStoreCoordinators बनाता है, प्रत्येक एक स्टोर ले जाता है।

जादुई रिकॉर्ड में, वहाँ NSPersistentStoreCoordinator + MagicalRecord.h में दुकानों को जोड़ने के लिए कई वर्ग तरीके हैं।

  • (NSPersistentStore *) MR_addInMemoryStore;
  • (एनएसपीर्सिस्टेंटस्टोर *) MR_addAutoMigratingSqliteStore नामांकित: (एनएसएसटींग *) storeFileName;
  • (एनएसपीर्सिस्टेंटस्टोर *) MR_addSqliteStoreNamed: (id) storeFileName withOptions: (__ autoreleasing NSDictionary *) विकल्प;

मुझे लगता है, कि इस जगह है जहाँ आप बात आप चाहते हैं कर सकता है।

इसके अलावा मैं उल्लेख करना चाहिए, कि ढेर स्थापित करने की पूरी प्रक्रिया MagicalRecord + Setup.h

+ (void) setupCoreDataStackWithStoreNamed:(NSString *)storeName 

में चला जाता है तो तुम वहाँ अपने स्टोर और समन्वयकों जोड़ सकते हैं। मैंने कभी इसे अपने आप प्रबंधित नहीं किया है, यह संभव समाधान की एक संक्षिप्त जांच थी।

6

मैं कॉन्फ़िगरेशन का उपयोग करके इस समस्या को हल करने में सक्षम था। चूंकि जादुई रिकॉर्ड हमेशा कॉन्फ़िगरेशन पैरामीटर के लिए null भेजता है, इसलिए मैंने setupCoreDataStackWithAutoMigratingSqliteStoreNamed को तोड़ दिया और इसे एक विधि के साथ बदल दिया जो एकाधिक कॉन्फ़िगरेशन का समर्थन करता है।

क्योंकि मैजिकल रिकॉर्ड ऑटो माइग्रेशन को संभालने का अच्छा काम करता है, इसलिए मैं पहले setupCoreDataStackWithAutoMigratingSqliteStoreNamed पर कॉल करता हूं, इसके बाद क्लीनअप होता है, और फिर मैं अपना प्रतिस्थापन कोड प्रदान करता हूं।

मेरे पास मेरे बीज डेटा ऑब्जेक्ट्स के साथ एक ऑब्जेक्ट मॉडल है जो "बीज" कॉन्फ़िगरेशन और "उपयोगकर्ता" कॉन्फ़िगरेशन को सौंपा गया उपयोगकर्ता ऑब्जेक्ट असाइन करता है। जादुई रिकॉर्ड पहले से ही शुरू किया जा चुका है ताकि यदि आवश्यक हो तो ऑटो माइग्रेट कर सकता है।

+(void) RB_setupMultipleStores:(NSString *) seedStoreName userStore:(NSString *) userStoreName 
/* change persistent store to one with multiple configurations. Assumes Magical Record is initialized. */ 
{ 
NSError * error= nil; 

[MagicalRecord cleanUp]; 

NSManagedObjectModel * model = [NSManagedObjectModel MR_defaultManagedObjectModel]; 

NSURL *seedURL = [NSPersistentStore MR_urlForStoreName:[seedStoreName stringByAppendingString:@".sqlite"]]; 

NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
         nil]; 

NSPersistentStore * seedStore =[coordinator 
            addPersistentStoreWithType:NSSQLiteStoreType 
            configuration:@"Seed" 
            URL:seedURL 
            options:options 
            error:&error]; 
if (!seedStore || error) 
{ 
    NSLog(@"Error setting up seed store:%@ for %@", [error localizedDescription], seedURL); 
    exit(-1); 
} 

NSURL *userURL = [NSPersistentStore MR_urlForStoreName:[userStoreName stringByAppendingString:@".sqlite"]]; 

NSPersistentStore * userStore = [coordinator 
           addPersistentStoreWithType:NSSQLiteStoreType 
           configuration:@"User" 
           URL:userURL 
           options:options 
           error:&error]; 

if (!userStore || error) 
{ 
    NSLog(@"Error setting up user store:%@ for %@", [error localizedDescription], userURL); 
    exit (-1); 
} 
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator]; 

[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator]; 
} 

इसके अलावा, एमआर 3.0 समवर्ती ढेर है जो इसे करने के बाद समस्या का समाधान कर सकता है।

+0

हाय @ रॉन, आप किस स्टोर को सेटअप करने के लिए पास करते हैं CoreDataStackWithAutoMigratingSqliteStore नामांकित है क्योंकि आपके पास उनमें से दो हैं? कोई बीज नहीं है? – DAN

0

विभिन्न स्टोर फ़ाइलों में विभिन्न कोर डेटा इकाइयों के लिए डेटा रखना अच्छी तरह से समर्थित और काफी सरल है। हालांकि, MagicalRecrd इस तरह से आपके कोर डेटा स्टैक को स्थापित करने के लिए कोई सुविधा विधियां प्रदान नहीं करता है। आपको बस अपना स्टैक मैन्युअल रूप से आवंटित करना होगा, और NSPersistentStoreCoordinator का उपयोग करने के लिए MagicalRecord को बताएं। यहाँ मैं यह कैसे तेजी में किया था:

import Foundation 
import CoreData 
import MagicalRecord 

class CoreDataSetup { 
    static func setupAutoMigratingStack(withContentConfigurationName contentConfigurationName: String, userConfirgurationNameName: String) { 
     MagicalRecord.cleanUp() 

     let managedObjectModel = NSManagedObjectModel.MR_defaultManagedObjectModel() 
     let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel!) 

     let contentURL = NSPersistentStore.MR_urlForStoreName(contentConfigurationName + ".sqlite") 
     let userURL = NSPersistentStore.MR_urlForStoreName(userConfirgurationNameName + ".sqlite") 
     let options = [ 
      NSMigratePersistentStoresAutomaticallyOption : true, 
      NSInferMappingModelAutomaticallyOption: true, 
      NSSQLitePragmasOption: ["journal_mode": "DELETE"] 
     ] 
     do { 
      try persistentStoreCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: contentConfigurationName, URL: contentURL, options: options) 
      try persistentStoreCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: userConfirgurationNameName, URL: userURL, options: options) 

      NSPersistentStoreCoordinator.MR_setDefaultStoreCoordinator(persistentStoreCoordinator) 
      NSManagedObjectContext.MR_initializeDefaultContextWithCoordinator(persistentStoreCoordinator) 
     } catch { 
      print("Error adding persistent store to coordinator: \(error) ") 
     } 
    } 
} 

नोट है कि मेरे कोड में मैं "सामग्री" और उपयोगकर्ता के definable दुकान के रूप में "उपयोगकर्ता" के रूप में "बीज" दुकान के अपने अवधारणा की चर्चा करते हुए कर रहा हूँ।

अपने प्रश्न के दूसरे पहलू को पूरा करने के लिए, सामग्री स्टोर को कॉन्फ़िगर करने के लिए कॉन्फ़िगर करने के लिए, आपको बस उन स्टोरों के साथ खेलना होगा जहां आप प्रत्येक स्टोर को स्टोर करते हैं, सामग्री स्टोर को गैर-बैक अप अप अस्थायी निर्देशिका में रखते हैं , और यदि आपके अस्तित्व में नहीं है तो इसे अपने ऐप बंडल से लॉन्च करने के लिए उस स्थान पर कॉपी करना।

संबंधित मुद्दे