2016-01-04 8 views
11
let config = Realm.Configuration(
     // Set the new schema version. This must be greater than the previously used 
     // version (if you've never set a schema version before, the version is 0). 
     schemaVersion: 1, 

     // Set the block which will be called automatically when opening a Realm with 
     // a schema version lower than the one set above 
     migrationBlock: { migration, oldSchemaVersion in 
      // We haven’t migrated anything yet, so oldSchemaVersion == 0 
      if (oldSchemaVersion < 1) { 
       // Nothing to do! 
       // Realm will automatically detect new properties and removed properties 
       // And will update the schema on disk automatically 
      } 
    }) 

    // Tell Realm to use this new configuration object for the default Realm 
    Realm.Configuration.defaultConfiguration = config 

    // Now that we've told Realm how to handle the schema change, opening the file 
    // will automatically perform the migration 
    let realm = try! Realm() 

इस आवेदन (आवेदन में डाल दिया गया था काम नहीं करता है: didFinishLaunchingWithOptions :)क्षेत्र प्रवासन

अपने परीक्षण कार्यक्रम में, मैं अपने वस्तु में फ़ील्ड्स बदल दिया है। मैं डेटाबेस में सब कुछ हटाना चाहता हूं, और नए फ़ील्ड प्रकारों पर जाना चाहता हूं। मैंने उपरोक्त कोड को दस्तावेज से कॉपी किया है, लेकिन ऐसा कुछ नहीं लगता है। मुझे अभी भी ये त्रुटियां मिलती हैं:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/ 

कोई विचार?

+1

'schemaVersion' पहले इस्तेमाल किए गए संस्करण से अधिक होना चाहिए। ऐसा लगता है कि वर्तमान स्कीमा संस्करण 1 से अधिक हो सकता है? क्या आप schemaVersion पैरामीटर में अधिक बड़ी संख्या उत्तीर्ण करने का प्रयास कर सकते हैं? –

उत्तर

3

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

आप सिम्युलेटर या डिवाइस से ऐप को हटाकर डेटाबेस को हटा सकते हैं। वैकल्पिक रूप से आप डेटाबेस तक पहुंचने से पहले Realm फ़ाइल को हटाने के लिए NSFileManager का उपयोग कर सकते हैं।

let defaultPath = Realm.Configuration.defaultConfiguration.path! 
try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
+4

यह वास्तविक समस्या का समाधान नहीं करता है, बल्कि यह केवल उत्पादन ऐप्स के लिए माइग्रेशन का उपयोग करने की अनुशंसा करता है। – codepushr

1

मुझे अक्सर भी वही घातक त्रुटि मिलती है। यह आमतौर पर तब होता है जब आप "प्राथमिक कुंजी" के साथ रीयल ऑब्जेक्ट में परिवर्तन करते हैं। सबसे तेज़ और सबसे आसान फ़िक्स बस डिवाइस या सिम्युलेटर से ऐप को हटाना है - फिर अपनी प्रोजेक्ट को फिर से चलाएं।

+0

आपके ऐप रिमोट यूजर डिवाइस पर कब है? तब आप क्या करते हो? – lwdthe1

0

क्या आप वाकई अपने स्कीमावर्सन को सही तरीके से अपडेट कर चुके हैं? यदि आप परिवर्तन करने से पहले schemaVersion: 1 सेट करते हैं, तो माइग्रेशन को ट्रिगर करने के लिए आपको इसे 2 में बदलना होगा।

2

सुनिश्चित करें कि आप माइग्रेशन कॉन्फ़िगरेशन application(application:didFinishLaunchingWithOptions:) में सेट होने से पहले Realm() के उदाहरण को तुरंत चालू करने का प्रयास नहीं करते हैं। जब यह दुर्घटनाग्रस्त हो जाता है यह पता लगाने के लिए कि किस उदाहरण ने अपवाद उठाया है, निष्पादन स्टैक जांचें। मेरे पास एक ही त्रुटि थी, मेरे मामले में माइग्रेशन ब्लॉक सेट होने से पहले मेरे दृश्य नियंत्रकों में से एक में रीयलम इंस्टेंस को तत्काल किया गया था।

गुड लक

9

मैं ने वही समस्या है जहाँ मेरे एप्लिकेशन तथ्य यह है कि मैं didFinishLaunchingWithOptions

समस्या यह है कि मैं वास्तव में में क्षेत्र का एक उदाहरण आरंभ किया गया था में डिफ़ॉल्ट प्रवास कोड जोड़ा बावजूद क्रैश हो रहा था मेरे पहले कक्षा स्तर की संपत्ति के रूप में नियंत्रक देखें। तो मेरे पहले व्यू कंट्रोलर से उस क्लास लेवल रीयल ऑब्जेक्ट को हटाने से समस्या ठीक हो गई।

import UIKit 
import RealmSwift 

class ViewController: UIViewController{ 
    let db = try! Realm() // Removing this solved my issue 

    func doSomething(){ 
    let db = try! Realm() // Placed this here instead 
    } 
} 

मैंने इसके बजाय ऑब्जेक्ट को उस फ़ंक्शन के अंदर बनाया जिसकी आवश्यकता है, जो कि एक बेहतर तरीका है।

+1

यह पुष्टि कर सकता है कि यह समस्या भी थी, धन्यवाद! – Luis

+1

मैं इसकी पुष्टि भी कर सकता हूं, – lwdthe1

+1

यह मुझे बचाया! मैं अपने लॉन्च व्यू कंट्रोलर में दायरे को तुरंत शुरू कर रहा था। मैंने डीडएपियर को देखने के लिए तत्कालता को स्थानांतरित कर दिया, और अब मेरा माइग्रेशन चल रहा है! धन्यवाद –

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