I am currently refactoring some old app and I am trying to migrate from SQLite to Realm. I have used Realm before and I have never encountered problem like this. When I start my app for first time (after installation), I get this exception:
E/AndroidRuntime: FATAL EXCEPTION:
Process: xx.xxx.xxx.beta.realm, PID: 25947
java.lang.IllegalArgumentException: A RealmObject with no @PrimaryKey cannot be updated: class xx.xxx.xxx.realm.Vod
at io.realm.Realm.checkHasPrimaryKey(Realm.java:1184)
at io.realm.Realm.copyToRealmOrUpdate(Realm.java:713)
at xx.xxx.xxx.services.VodService$4.run(VodService.java:232)
at java.lang.Thread.run(Thread.java:818)
My Vod class looks like this and object is properly created, i.e. has value for PrimaryKey and all other fields:
public class Vod extends RealmObject {
@PrimaryKey
private String uuid;
private String name;
private Integer lengthMin;
private Boolean hasTrailer;
private String description;
private String originalName;
//etc...
//getters & setters
This will crash the app. But after that first time (and every next time) everything works fine - with same code and same data. But when I uninstall and reinstall app again, I will also encounter this exception again. The part of code in question runs on background thread. If I move it to UI thread, everything works fine even for first time. But I want to parse network responses on background thread and not on UI. Also it isn't specific to Vod class, if I skip data for Vod and start with, for example, User class, then I get "no @PrimaryKey" exception for User class.
Sometimes it also throws this exception:
D/REALM: jni: ThrowingException 5, , .
D/REALM: Exception has been throw: File not found: .
E/AndroidRuntime: FATAL EXCEPTION:
Process: xx.xxx.xxx.beta.realm, PID: 28555
io.realm.exceptions.RealmIOException: File not found: .
at io.realm.internal.SharedGroup.createNativeWithImplicitTransactions(Native Method)
at io.realm.internal.SharedGroup.<init>(SharedGroup.java:67)
at io.realm.internal.SharedGroupManager.<init>(SharedGroupManager.java:47)
at io.realm.BaseRealm.<init>(BaseRealm.java:76)
at io.realm.Realm.<init>(Realm.java:126)
at io.realm.Realm.createAndValidate(Realm.java:246)
at io.realm.Realm.createInstance(Realm.java:231)
at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:114)
at io.realm.Realm.getDefaultInstance(Realm.java:181)
at xx.xxx.xx.services.RecordingService$9.run(RecordingService.java:317)
at java.lang.Thread.run(Thread.java:818)
which leads me to think, that there will be some problem with initialization of Realm file? I create it like this:
public class MainApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
mRealmConfig = new RealmConfiguration.Builder(mContext).build();
Realm.setDefaultConfiguration(mRealmConfig);
}
}
and then use this to get instance in thread:
Realm localRealm = Realm.getDefaultInstance();
Am I doing something wrong? Has anyone has this type of problem before? I tried to search web for answer, but found nothing useful. Thanks for any help.
(I'm using io.realm:realm-android:0.87.4)
EDIT: I have confirmed (via ADB), that internal storage folder for my app package is removed after uninstall. While checking that, I found out that my files folder in path /data/data//files is empty during first app run. Is that correct behavior? Also, I cannot see anything inside Realm via Stetho.
Steps: 1. I uninstall app
ADB says cd: /data/data/xx.xxx.xxx.beta.realm: No such file or directory
I install and run app again
ADB run-as xx.xxx.xxx.beta.realm -> cd files -> ls -> empty
Inspect via Stetho, shows no data
Wait for minute or so (to give Realm time to create whatever needs)
Start network requests and app crashes ("no @PrimaryKey" exception) with first data to parse outside UI thread (parsing on UI works fine)
ADB -> files folder -> ls -> I can see everything, default.realm, default.realm.lock, default.realm.log, default.realm.log_a, default.realm.log_b
Start app again, everything works fine, I can even see realm data via Stetho.
I really hope that I am making some stupid mistake and that everything will be fine at last. Also one more thing, on app start I see this log few times:
Rejecting re-init on previously-failed class java.lang.Class<io.realm.rx.RealmObservableFactory$4>
I have read this: https://github.com/realm/realm-java/issues/1990 and I don't think, that it is related to my problem, but just to be sure.
It's possible that your imports are messed up. Be sure to be importing io.realm.annotations.PrimaryKey, and not androidx.room.PrimaryKey, which might be a common issue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With