2016-08-23 77 views
-1

的境界文檔中的長度域,它被寫入排序與串

result = result.sort("name", Sort.DESCENDING); 

簡單的排序,但我想首先

通常在MySQL,我們有

order by CHAR_LENGTH(Field) 
最短名稱排序

在這方面有沒有像這樣的方法?

回答

5

沒有,但你可以很容易地重新定義的制定者,因爲0.88.0,你做到以下幾點:

public class Word extends RealmObject { 
    private String name; 

    @Index 
    @Required 
    private long nameLength; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
     this.nameLength = name == null ? 0 : name.length(); 
    } 
} 

而且你可以指定將創建此預先存在的元素

public class Migration implements RealmMigration { 
    @Override 
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) { 
     RealmSchema schema = realm.getSchema(); 
     if(oldVersion == 0) { 
      RealmObjectSchema wordSchema = schema.get("Word"); 
      wordSchema.addField("nameLength", long.class, FieldAttribute.INDEXED, FieldAttribute.REQUIRED) 
         .transform(new RealmObjectSchema.Function() { 
          @Override 
          public void apply(DynamicRealmObject obj) { 
           obj.set("nameLength", obj.getString("name").length()); 
          } 
         }); 
      oldVersion++; 
     } 
    } 

    @Override 
    public void equals(Object object) { 
     return object != null && object instanceof Migration; 
    } 

    @Override 
    public int hashCode() { 
     return Migration.class.hashCode(); 
    } 
} 

RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(context) 
              .schemaVersion(1) 
              .migration(new Migration()) 
              .build(); 
遷移

然後,你可以很容易地做到

realm.where(Word.class).findAllSorted(WordFields.NAME_LENGTH, Sort.ASCENDING, 
             WordFields.NAME, Sort.ASCENDING); 
+0

這將在安裝後運行一次,以創造新的領域?這還需要很長時間才能運行150000個對象? – phpdroid

+0

以及你**可以**也可以將此字段添加到您的資產文件中,然後您將不必指定遷移 – EpicPandaForce

+1

更好的是我將重建數據庫的長度爲'name'字段 – phpdroid