写入数据库时的领域空指针
Realm null pointer when writing to database
空指针应该很容易修复,但我不明白为什么我在这里得到NullPointerException
。
public static void updateUserCity(String city, Context context) {
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
RealmQuery<User> query = realm.where(User.class);
User user = query.findFirst();
if (user != null) {
user.setCity(new City(0, city, city)); // here it crashes
}
realm.commitTransaction();
}
还有我的堆栈跟踪:
java.lang.NullPointerException
at io.realm.UserRealmProxy.setCity(UserRealmProxy.java:118)
at com.ratata.adapters.DatabaseAdapter.updateUserCity(DatabaseAdapter.java:38)
at com.ratata.services.userManagment.UserManager.updateCity(UserManager.java:30)
at com.ratata.dialogs.MainTabDialog.updateUserData(MainTabDialog.java:92)
at com.ratata.dialogs.MainTabDialog.updateTab(MainTabDialog.java:84)
at com.ratata.dialogs.MainTabDialog.access[=11=]0(MainTabDialog.java:32)
at com.ratata.dialogs.MainTabDialog.onClick(MainTabDialog.java:50)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
User
不是 null
,所以我应该 setCity
这个对象。我用给定的数据创建 new City
。
我已经设法解决了这个问题。显然我无法创建新对象并将其保存到 Realm
,所以我采用了另一种方式。
public static void updateUserCity(String city, Context context) {
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
RealmQuery<User> query = realm.where(User.class);
User user = query.findFirst();
City realmCity = user.getCity();
realmCity.setName(city);
realmCity.setRepresentativeName(city);
user.setCity(realmCity);
realm.commitTransaction();
}
这里的问题是 new City(0, city, city)
是一个独立的对象。 Realm 将生成一个代理 class 以在 Realm 内部使用。而这里玩setCity
的时候,需要传递一个带代理的对象
你可以试试这个:
user.setCity(realm.copyToRealmOrUpdate(new City(0, city, city)));
参见文档 here
空指针应该很容易修复,但我不明白为什么我在这里得到NullPointerException
。
public static void updateUserCity(String city, Context context) {
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
RealmQuery<User> query = realm.where(User.class);
User user = query.findFirst();
if (user != null) {
user.setCity(new City(0, city, city)); // here it crashes
}
realm.commitTransaction();
}
还有我的堆栈跟踪:
java.lang.NullPointerException
at io.realm.UserRealmProxy.setCity(UserRealmProxy.java:118)
at com.ratata.adapters.DatabaseAdapter.updateUserCity(DatabaseAdapter.java:38)
at com.ratata.services.userManagment.UserManager.updateCity(UserManager.java:30)
at com.ratata.dialogs.MainTabDialog.updateUserData(MainTabDialog.java:92)
at com.ratata.dialogs.MainTabDialog.updateTab(MainTabDialog.java:84)
at com.ratata.dialogs.MainTabDialog.access[=11=]0(MainTabDialog.java:32)
at com.ratata.dialogs.MainTabDialog.onClick(MainTabDialog.java:50)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
User
不是 null
,所以我应该 setCity
这个对象。我用给定的数据创建 new City
。
我已经设法解决了这个问题。显然我无法创建新对象并将其保存到 Realm
,所以我采用了另一种方式。
public static void updateUserCity(String city, Context context) {
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
RealmQuery<User> query = realm.where(User.class);
User user = query.findFirst();
City realmCity = user.getCity();
realmCity.setName(city);
realmCity.setRepresentativeName(city);
user.setCity(realmCity);
realm.commitTransaction();
}
这里的问题是 new City(0, city, city)
是一个独立的对象。 Realm 将生成一个代理 class 以在 Realm 内部使用。而这里玩setCity
的时候,需要传递一个带代理的对象
你可以试试这个:
user.setCity(realm.copyToRealmOrUpdate(new City(0, city, city)));
参见文档 here