枚举 RealmNamingPolicy

  • 所有已实现的接口:
    Serializable, Comparable<RealmNamingPolicy>

    public enum RealmNamingPolicy
    extends Enum<RealmNamingPolicy>
    该枚举定义了将类名和字段名从 Java 中使用的名称映射到 Realm 文件内部使用的名称的可能方法。

    有用的示例:

    • 支持具有相同简单名称但位于不同包中的两个模型类。
    • 由于命名约定不同,因此可以更轻松地使用跨平台模式。
    • 使用长度超过 Realm 强制执行的 57 个字符限制的 Java 类名。
    • 在 Java 中更改字段名称而不强制应用用户完成迁移过程。
    根据策略的应用位置,其语义略有不同:
    • 如果应用于RealmModule.classNamingPolicy() ,该模块的所有类部分都会受到影响。 如果一个类是多个模块的一部分,则必须对这两个模块应用相同的命名策略,否则会引发错误。
    • 如果应用于RealmModule.fieldNamingPolicy() ,此模块的所有类部分中的所有持久字段都将受到影响。
    • 如果应用于RealmClass.fieldNamingPolicy() ,该类中的所有字段都会受到影响。 这将覆盖模块上指定的任何字段命名策略。

    示例:

     
     \@RealmClass(name = "__person", fieldNamingPolicy = RealmNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
     public class Person implements RealmModel { // is converted to "__person" internally
         public string firstName; // Is converted to "first_name" internally
     }
     
     

    选择与 Java 模型类中使用的名称不同的内部名称会产生以下影响:

    • DynamicRealm的查询必须使用内部名称。 对普通Realm实例的查询必须继续使用 Java 类中定义的名称。
    • 在创建类和字段时,迁移必须使用内部名称。
    • 报告的模式错误将使用内部名称。

    自动转换 Java 变量名称时,每个变量名称都会通过将其拆分为单词列表来进行规范化,然后使用目标格式的规则将这些单词列表连接起来。 以下启发式方法用于确定“词”的构成。

    1. 每当遇到_$时。 例如“_FirstName”、“_First_Name”和“$First$Name”,它们都会成为“First”和“Name”。
    2. 每当您从小写字符切换到大写字符时,如Character.isUpperCase(int)Character.isLowerCase(int)标识的那样。 示例是“FirstName”,它变为“First”和“Name”。
    3. 每当您从多个大写字符切换为小写字符时。 假定最后一个大写字母是下一个单词的一部分。 这是通过使用Character.isUpperCase(int)Character.isLowerCase(int)来标识的。 示例是“FIRSTName”,它变为“FIRST”和“Name.
    4. 有些字符(例如表情符号)既不是大写字符,也不是小写字符,因此它们将是当前单词的一部分。 例如,“my😁”和“MY😁”都被视为一个单词。
    5. 匈牙利表示法,即以小写“m”开头,后跟大写字母的变量名称,将被删除,不被视为任何单词的一部分。 示例为“mFirstName”和“mFIRSTName”,它们分别变为“First”和“Name”。

    请注意,更改内部名称不会影响从 JSON 导入数据。 JSON 数据仍须遵循 Realm Java 类中定义的名称。

    在使用 Moshi、GSON 或 Jackson 等标准库解析 JSON 时,请务必记住,这些库定义从 JSON 到 Java 的转换,而设置内部 Realm 名称定义从 Java 到 Realm 文件的转换。

    这意味着,如果您想使用这些库将数据从 JSON 导入 Realm,您仍然需要提供来自 JSON 解析器库和 Realm 的注解。

    使用 Moshi,它看起来像这样:

     
     public class Person extends RealmObject {
         \@Json(name = "first_name") // Name used in JSON input.
         \@RealmField(name = "first_name") // Name used internally in the Realm file.
         public string firstName; // name used in Java
     }
     
     
    另请参阅:
    RealmModule , RealmClass , RealmField
    • 枚举常量详细信息

      • NO_POLICY

        public static final RealmNamingPolicy NO_POLICY
        未应用任何策略。 此策略不会覆盖在父元素上设置的任何策略,例如,如果在RealmClass.fieldNamingPolicy()中设置,则模块策略仍将应用于字段名称。

        如果两个模块对该策略存在分歧,且其中一个模块为NO_POLICY ,则系统会选择另一个模块,而不会引发错误。

        此策略为默认策略。

      • IDENTITY

        public static final RealmNamingPolicy IDENTITY
        Java 模型类中的名称在内部按原样使用。
      • CAMEL_CASE

        public static final RealmNamingPolicy CAMEL_CASE
        Java 模型类中的名称将转换为驼峰命名法,即所有单词都连接在一起,第一个单词的第一个字母小写,所有后续单词的第一个字母大写。 这是 Java、Kotlin、Swift 和 JavaScript 中的标准命名模式。

        示例:"firstName"、"FirstName"、"mFirstName"、"FIRST_NAME"、"First$Name" 均会变为 "firstName"。

      • PASCAL_CASE

        public static final RealmNamingPolicy PASCAL_CASE
        Java 模型类中的名称将转换为 PascalCase,即所有单词都连接在一起,并且所有单词的首字母大写。 这是 .NET 中的默认命名方案。

        示例:"firstName"、"FirstName"、"mFirstName"、"FIRST_NAME"、"First$Name" 均会变为 "FirstName"。

      • LOWER_CASE_WITH_UNDERSCORES

        public static final RealmNamingPolicy LOWER_CASE_WITH_UNDERSCORES
        Java 模型类中的名称将转换为小写,每个单词用_分隔。 这是 C++ 中的默认命名方案。

        示例:"firstName"、"FirstName"、"mFirstName"、"FIRST_NAME"、"First$Name" 均会变为 "first_name"。

    • 方法详细信息

      • values

        public static RealmNamingPolicy[] values()
        按声明顺序返回包含此枚举类型常量的数组。 此方法可用于迭代常量,如下所示:
        for (RealmNamingPolicy c : RealmNamingPolicy.values())   System.out.println(c);
        
        返回:
        包含此枚举类型常量的数组,按声明顺序排列
      • 的值

        public static RealmNamingPolicy valueOf​(String name)
        返回具有指定名称的该类型的枚举常量。 该字符串必须与用于声明此类型的枚举常量的标识符完全匹配。 (不允许使用多余的空白字符。)
        参数:
        name - 要返回的枚举常量的名称。
        返回:
        具有指定名称的枚举常量
        抛出异常:
        IllegalArgumentException - 如果此枚举类型没有指定名称的常量
        NullPointerException - 如果参数为 null