问题描述
我有以下活动。
- User_info:我在其中编辑文本框以从 sqlite 获取用户数据并允许用户更改其数据。
- User_confirmation:如果用户想要修改他的个人信息,他需要去活动 User_info,但在去之前他必须重新输入他的电子邮件和密码。
这是 DBHelper 类中的一个函数,用于向 user_info 发送数据。
public Cursor getAllData(String email,String password) {
sqliteDatabase db = this.getWritableDatabase();
Cursor res=null;
if ( res.movetoFirst())
res = db.rawQuery("Select * from persons where email = ? and password = ?",new String[]{email,password});
return res;
}
}
我收到此错误。
2021-06-15 15:18:52.264 26638-26638/nanodevlab.screens E/AndroidRuntime: FATAL EXCEPTION: main
Process: nanodevlab.screens,PID: 26638
java.lang.RuntimeException: Unable to start activity ComponentInfo{nanodevlab.screens/nanodevlab.screens.userconfirmation}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.movetoFirst()' on a null object reference
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(UnkNown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.movetoFirst()' on a null object reference
at nanodevlab.screens.DBHelper.getAllData(DBHelper.java:80)
at nanodevlab.screens.userconfirmation.onCreate(userconfirmation.java:36)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(UnkNown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
2021-06-15 15:18:52.355 26638-26643/nanodevlab.screens I/zygote: JIT allocated 56KB for compiled code of void android.view.View.<init>(android.content.Context,android.util.AttributeSet,int,int)
Cursor c=DB.getAllData(emailid,pass);
int index = c.getColumnIndexOrThrow("username");
String firstName = c.getString(index);
解决方法
在方法 getAllData()
中,您将 res
设置为 null
,然后尝试 moveToFirst()
抛出错误。
不需要 moveToFirst()
,因为 getAllData()
的目的是返回游标而不是迭代它。
您的代码可以简化为:
public Cursor getAllData(String email,String password) {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("Select * from persons where email = ? and password = ?",new String[]{email,password});
}