移除Android Realm中Post模型类主键后运行报错的解决方法
我有一个位于com.example.sudeepbajracharya.assignment.entity路径下的Post模型类,代码如下:
import com.google.gson.annotations.SerializedName; import io.realm.RealmObject; public class Post extends RealmObject { @SerializedName("userId") private int userId; @SerializedName("id") private int id; // 之前此处标注了@PrimaryKey注解,现已移除 @SerializedName("title") private String title; @SerializedName("body") private String body; // getter和setter方法 public void setUserId(int userId) { this.userId = userId; } public void setId(int id) { this.id = id; } public void setTitle(String title) { this.title = title; } public void setBody(String body) { this.body = body; } public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return title; } public String getBody() { return body; } }
此前我为id字段添加了@PrimaryKey注解,现在希望移除该主键,于是删除了@PrimaryKey注解,但运行应用时出现错误提示:
'Post' has a primary key, use 'createObject(Class, Object)' instead
请问如何解决该问题,彻底移除模型类的主键?
这个问题我之前也碰到过,本质是Realm的持久化架构缓存和当前代码结构不匹配,再加上可能存在旧的对象创建逻辑残留,按以下步骤就能彻底解决:
步骤1:清理Realm旧数据库文件
Realm会把模型架构持久化存储在本地数据库中,哪怕你改了代码,旧数据库依然会认为Post类带主键。开发环境下最简单的方式是卸载重装你的APP;如果不想卸载,也可以临时加一段代码删除旧数据库(测试完记得移除):RealmConfiguration config = new RealmConfiguration.Builder().build(); Realm.deleteRealm(config); // 删除旧的Realm数据库文件步骤2:修改Post对象的创建逻辑
如果你之前创建Post用了带主键的createObject重载方法:// 旧代码:依赖主键的创建方式 Post post = realm.createObject(Post.class, postId);现在必须改成不带主键的创建方式,或者先实例化对象再写入Realm:
// 方式1:不带主键的createObject Post post = realm.createObject(Post.class); post.setId(postId); // 手动设置id值 // 方式2:先创建对象再复制到Realm Post post = new Post(); post.setId(postId); post.setTitle("测试标题"); realm.beginTransaction(); realm.copyToRealm(post); realm.commitTransaction();步骤3:确认注解移除并清理构建缓存
再检查一遍Post类的id字段,确保@PrimaryKey注解完全删除,没有任何残留。然后在Android Studio中执行Build -> Clean Project,再执行Build -> Rebuild Project,清理掉旧的编译缓存,避免旧代码片段干扰运行。步骤4:正式环境的迁移处理(可选)
如果是不能卸载APP的正式环境,你需要编写Realm迁移代码来更新架构,明确移除主键约束:RealmMigration migration = new RealmMigration() { @Override public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { RealmSchema schema = realm.getSchema(); if (oldVersion < 1) { // 移除Post类的主键约束 schema.get("Post") .removePrimaryKey(); oldVersion++; } } }; RealmConfiguration config = new RealmConfiguration.Builder() .schemaVersion(1) // 版本号需高于旧版本 .migration(migration) .build();
按以上步骤操作后,就能彻底移除Post类的主键,解决报错问题。
内容的提问来源于stack exchange,提问作者Sudeep

