2016-03-07 9 views
14

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

तो, मुझे इस माइग्रेशन को कैसे लागू करें इस पर थोड़ा सा सवाल है? कोई भी लीड सहायक हो सकती है। धन्यवाद।

मेरा रियलम माइग्रेशन निम्नानुसार है।

public class RealmMigrationClass implements RealmMigration { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
     if(oldVersion == 0) { 
      RealmSchema sessionSchema = realm.getSchema(); 

      if(oldVersion == 0) { 
       RealmObjectSchema sessionObjSchema = sessionSchema.get("Session"); 
       sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED) 
         .transform(new RealmObjectSchema.Function() { 
          @Override 
          public void apply(DynamicRealmObject obj) { 
           obj.set("isSessionRecordingUploading", false); 
          } 
         }); 


       sessionObjSchema.setNullable("isSessionRecordingUploading",false); 
       oldVersion++; 
      } 

     } 
    } 

} 

public class Session extends RealmObject { 

    @PrimaryKey 
    private String id; 
    @Required 
    private Date date; 
    private double latitude; 
    private double longitude; 
    private String location; 
    private String note; 
    private String appVersion; 
    private String appType; 
    private String deviceModel; 
    private HeartRecording heart; 
    private TemperatureRecording temperature; 
    private LungsRecording lungs; 
    @NotNull 
    private boolean isSessionRecordingUploading; 
    private boolean sessionInfoUploaded; 
    private boolean lungsRecordingUploaded; 
    private boolean heartRecordingUploaded; 

} 

लघु प्रश्न कटौती करने के लिए RealmObject से मनुष्य और Setters निकाला गया। अपवाद तब हुआ जब मैं पिछले एक को अनइंस्टॉल किए बिना ऐप को पुनर्स्थापित करने का प्रयास करता हूं। कृपया सलाह दें।

उत्तर

20

यह यहाँ वर्णित है: https://realm.io/docs/java/latest/#migrations

लेकिन संक्षेप में, तुम बस स्कीमा संस्करण टक्कर और इस तरह कॉन्फ़िगरेशन सेट:

RealmConfiguration config = new RealmConfiguration.Builder(context) 
    .schemaVersion(2) // Must be bumped when the schema changes 
    .migration(new MyMigration()) // Migration to run 
    .build(); 

Realm.setDefaultConfiguration(config); 

// This will automatically trigger the migration if needed 
Realm realm = Realm.getDefaultInstance(); 
+0

धन्यवाद ईसाई। अगर मेरी समझ सही है, तो मॉडल में नया बनाया गया फ़ील्ड होगा और सभी Realm.getInstance (यह) Realm.getInstance (ऊपर की तरह बनाया गया कॉन्फ़िगरेशन> होगा) – User

+2

हाँ, यह सही है। आपको 'Realm.getDefaultInstance()' या 'Realm.getInstance (RealmConfiguration) 'का उपयोग' Realm.getInstance (Context)' के बजाय करना चाहिए। –

+0

आज मैंने कोशिश की, मुझे "io.realm.exceptions.RealmMigrationNeededException: Field 'isessionRecordingUploading' मौजूदा दायरे फ़ाइल में शून्य मानों का समर्थन करता है। फ़ील्ड 'isSessionRecordingUploading' के लिए संबंधित बॉक्स किए गए प्रकार का उपयोग करें या io.realm.internal.Table का उपयोग करके माइग्रेट करें .convertColumnToNotNullable() "। मैंने रीयलमैमिशन क्लास को थोड़ा सा संशोधित किया और मेरे दायरे ऑब्जेक्ट में फ़ील्ड में पूर्ण एनोटेशन नहीं जोड़ा। लेकिन फिर भी मैं इस मुद्दे को दूर नहीं कर सका। मैंने Q. – User

0

यह एक सहायक वर्ग मैं एक आयात करने के लिए बनाया है। मेरे आवेदन के लिए दायरे डेटाबेस। मेरे मामले में मैं सिर्फ एक Android आवेदन में एक ऐसा iOS ऐप्लिकेशन से बनाए गए डाटाबेस को पढ़ने के लिए

public class RealmImporter { 
private Activity activity; 
private String dbaFullName = "db.realm"; 
private int rawRealmResource = R.raw.dbRealmResource; 


public RealmImporter (Activity activity) { 
    this.activity = activity; 
    importData(); 
} 


private RealmConfiguration getConfiguration() { 
    RealmConfiguration config = new RealmConfiguration.Builder() 
      .name(dbaFullName) 
      .modules(new MyRealmModule()) 
      .migration(new RealmMigration() { 
       @Override 
       public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 

       } 
      }) 
      .build(); 

    return config; 
} 

public Realm getInstance() { 
    Realm realm = Realm.getInstance(getConfiguration()); 

    return realm; 
} 

private void importData() { 
    copyBundledRealmFile(activity.getResources().openRawResource(rawRealmResource), dbaFullName); 

    Realm.init(activity); 
} 

private String copyBundledRealmFile(InputStream inputStream, String outFileName) { 
    try { 
     File file = new File(activity.getFilesDir(), outFileName); 
     if (file.exists()) { 
      return file.getAbsolutePath(); 
     } 
     FileOutputStream outputStream = new FileOutputStream(file); 
     byte[] buf = new byte[1024]; 
     int bytesRead; 

     while ((bytesRead = inputStream.read(buf)) > 0) { 
      outputStream.write(buf, 0, bytesRead); 
     } 

     outputStream.close(); 
     return file.getAbsolutePath(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 


// Create the module 
@RealmModule(classes = { Artigo.class, Comparativo.class, Indice.class, ItemDeArtigo.class}) 
public static class MyRealmModule{ 
} 
} 

आप एक से अधिक दायरे विन्यास है, तो (यदि आप एक से अधिक .realm फ़ाइल आयात करने की जरूरत है) आप की जरूरत की जरूरत है RealMModule क्लास बनाएं और RealmConfiguration.builder पर .modules() विकल्प का उपयोग करें।

यह आवश्यक है क्योंकि डिफ़ॉल्ट क्षेत्र में यह जांचने का प्रयास करें कि आपके .remalm में आपके सभी मॉडलों के लिए टेबल हैं जो RealmObject का विस्तार करते हैं, और यदि आपके पास एकाधिक हैं। हर कोई, उनमें से प्रत्येक में आपकी कुछ कक्षाएं होंगी (लेकिन सभी नहीं उनमें से)।

एक और उपयोगी जानकारी यह है कि एंड्रॉइड माइग्रेशन के लिए तेज़ी से। सभी स्ट्रिंग गुणों को @Required anototation (यदि उनके पास डिफ़ॉल्ट मान है) के साथ घोषित किया जाना चाहिए।

यदि दायरे आपको एक अजीब अपवाद दे रहा है जैसे "इस वर्ग को इस स्कीमा में नहीं मिला", तो आप ऐप को फिर से चलाने का प्रयास करें, आमतौर पर यह एक अलग त्रुटि देता है जो वास्तविक समस्या को संकेत दे सकता है हालांकि कभी-कभी यह केवल एक देता है कोई भी त्रुटि।

+0

['RealmConfiguration.assetFile()'] है (https://realm.io/docs/java/latest/api/io/realm/RealmConfiguration.Builder.html#assetFile-java.lang.String-) भी मुख्यधारा? साथ ही, "यादृच्छिक त्रुटियां" नहीं हैं, आपको शायद त्वरित रन अक्षम करना चाहिए। – EpicPandaForce

+0

हाय, मैं बस अन्य उपयोगकर्ताओं की मदद करने की कोशिश कर रहा हूं। अपने कोड के साथ अपने कोड को संपादित करने के लिए स्वतंत्र महसूस करें। और मैंने तत्काल रन को अक्षम कर दिया है, फिर भी मैं यादृच्छिक त्रुटियों में चला गया हूं जैसे "यह तालिका/कक्षा मौजूद नहीं है" भले ही मुझे यकीन है कि फ़ाइल और तालिका मौजूद है, और यह समाप्त हो गया है कि त्रुटि "मॉड्यूल" की वजह से थी। – sagits

+0

मैं बस इतना कह रहा हूं कि दायरे में पहले से ही 'परिसंपत्तिफाइल()' है, इसलिए आपको प्रतिलिपि मैन्युअल रूप से लिखने की आवश्यकता नहीं है: पी – EpicPandaForce

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