使用字符串的长度在Realm中排序

php*_*oid -1 java sql database android realm

在领域文档中,它被写入

result = result.sort("name", Sort.DESCENDING);
Run Code Online (Sandbox Code Playgroud)

简单的排序,但我想按最短的名字排序

通常在我们的MySql中

order by CHAR_LENGTH(Field)
Run Code Online (Sandbox Code Playgroud)

在这个领域有这样的方法吗?

Epi*_*rce 5

不,但是你可以很容易地从0.88.0重新定义一个setter,你可以在其中执行以下操作:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以指定一个迁移,为预先存在的元素创建此迁移

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();
Run Code Online (Sandbox Code Playgroud)

然后你可以轻松做到

 realm.where(Word.class).findAllSorted(WordFields.NAME_LENGTH, Sort.ASCENDING, 
                                       WordFields.NAME, Sort.ASCENDING);
Run Code Online (Sandbox Code Playgroud)