无法通过此异常
Cant get pass this exception
所以我在 android studio 中编写用于登录和注册的代码让我将其粘贴到这里:
package com.example.myapplication.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.widget.*;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class database extends SQLiteOpenHelper {
private final static String dbName = "user.db";
private final static String tableName = "customer";
private int Id;
private static final String ID_COL = "ID";
private static final String NAME_COL = "NAME";
private static final String EMAIL_COL = "EMAIL";
private static final String PASS_COL = "PASS";
private static final String MOBILE_COL = "MOBILE";
private final static int dbVersion = 3;
Context context;
public database(Context context){
super(context,dbName,null,dbVersion);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase = this.getWritableDatabase();
String query = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + ID_COL + " VARCHAR(50) PRIMARY KEY," + NAME_COL + " VARCHAR(50)," + EMAIL_COL + " VARCHAR(50)," + PASS_COL + " VARCHAR(50), "+MOBILE_COL+" VARCHAR(50));";
sqLiteDatabase.execSQL(query);
}
public boolean checkAlreadyExists(){
SQLiteDatabase db = this.getReadableDatabase();
String check = "SELECT * FROM "+tableName+" WHERE ID ="+Id+";";
Cursor cursor = db.rawQuery(check,null);
if(cursor.getCount() > 0){
cursor.close();
return true;
}
else
{
cursor.close();
return false;
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL("DROP TABLE IF EXISTS "+tableName);
onCreate(db);
}
public void addRecord(String id,String name,String email,String pass){
SQLiteDatabase sql = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ID_COL,id);
values.put(NAME_COL,name);
values.put(EMAIL_COL,email);
values.put(PASS_COL,pass);
if(!checkAlreadyExists()) {
long res = sql.insert(tableName,null,values);
if(res==-1) {
Toast.makeText(context, "Registration Failed", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(context,"You Have Been Registered..//",Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(context,"User Already Exists.Please Login.",Toast.LENGTH_LONG).show();
}
}
public boolean login(String loginId,String loginPass){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName,null,ID_COL+" = ? AND "+PASS_COL+" =? ",new String[]{loginId,loginPass},null,null,null);
try
{
if(cursor.moveToFirst())
return true;
}catch(Exception e){
String message = e.getMessage();
Log.v("Database.java","login:"+e.getMessage());
}
finally {
cursor.close();
}
return false;
}
}
这是按下按钮的代码:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.example.myapplication.database.database;
public class RegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initializeUI();
}
private String id;
private int Id;
private String name;
private String pass;
private String email;
private String confirm;
private String mobile;
private EditText NAME;
private EditText PASSWORD;
private EditText CONFIRMPASSWORD;
private EditText EMAIL;
private EditText REGISTER;
private EditText ID;
//Below method initializes the UI.
public void initializeUI(){
ID = (EditText)findViewById(R.id.registerID);
NAME = (EditText) findViewById(R.id.registerName);
PASSWORD = (EditText) findViewById(R.id.registerPassword);
EMAIL = (EditText) findViewById(R.id.registerEmail);
CONFIRMPASSWORD = (EditText) findViewById(R.id.registerConfirmPassword);
}
//Register process gets called.
public void buttonPressed(View view){
database db = new database(RegisterActivity.this);
id = ID.getText().toString();
name = NAME.getText().toString();
email = EMAIL.getText().toString();
pass = PASSWORD.getText().toString();
confirm = CONFIRMPASSWORD.getText().toString();
//Seeing if the password matches.
if (pass.equals(confirm)) {
db.addRecord(id, name, email, pass);
ID.setText("");
NAME.setText("");
EMAIL.setText("");
PASSWORD.setText("");
CONFIRMPASSWORD.setText("");
Intent in = new Intent(RegisterActivity.this,LoginActivity.class);
startActivity(in);
} else {
Toast.makeText(RegisterActivity.this, "Password are Incorrect..//", Toast.LENGTH_LONG).show();
}
}
}
我收到以下异常:
E/AndroidRuntime:致命异常:main
进程:com.example.myapplication,PID:3980
java.lang.IllegalStateException: 无法执行 android:onClick 的方法
在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:446)
在 android.view.View.performClick(View.java:5610)
在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
在 android.view.View$PerformClick.run(View.java:22265)
在 android.os.Handler.handleCallback(Handler.java:751)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 android.os.Looper.loop(Looper.java:154)
在 android.app.ActivityThread.main(ActivityThread.java:6077)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
原因:java.lang.reflect.InvocationTargetException
在 java.lang.reflect.Method.invoke(本机方法)
在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441)
在 android.view.View.performClick(View.java:5610)
在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
在 android.view.View$PerformClick.run(View.java:22265)
在 android.os.Handler.handleCallback(Handler.java:751)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 android.os.Looper.loop(Looper.java:154)
在 android.app.ActivityThread.main(ActivityThread.java:6077)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
原因:java.lang.IllegalStateException:递归调用 getDatabase
在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)
在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
在 com.example.myapplication.database.database.onCreate(database.java:28)
在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
在 com.example.myapplication.database.database.addRecord(database.java:52)
在 com.example.myapplication.RegisterActivity.buttonPressed(RegisterActivity.java:51)
在 java.lang.reflect.Method.invoke(本机方法)
在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441)
在 android.view.View.performClick(View.java:5610)
在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
在 android.view.View$PerformClick.run(View.java:22265)
在 android.os.Handler.handleCallback(Handler.java:751)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 android.os.Looper.loop(Looper.java:154)
在 android.app.ActivityThread.main(ActivityThread.java:6077)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
有人可以帮助我吗?
您应该始终查找异常的 Caused by
部分:
Caused by: java.lang.IllegalStateException: getDatabase called recursively
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.example.myapplication.database.database.onCreate(database.java:28) at
您正在 SQLiteOpenHelper
的 onCreate()
方法中调用 getWritableDatabase()
。不要那样做 - 使用传递给 onCreate()
方法的 sqLiteDatabase
代替:
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String query = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + ID_COL + " VARCHAR(50) PRIMARY KEY," + NAME_COL + " VARCHAR(50)," + EMAIL_COL + " VARCHAR(50)," + PASS_COL + " VARCHAR(50), "+MOBILE_COL+" VARCHAR(50));";
sqLiteDatabase.execSQL(query);
}
所以我在 android studio 中编写用于登录和注册的代码让我将其粘贴到这里:
package com.example.myapplication.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.widget.*;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class database extends SQLiteOpenHelper {
private final static String dbName = "user.db";
private final static String tableName = "customer";
private int Id;
private static final String ID_COL = "ID";
private static final String NAME_COL = "NAME";
private static final String EMAIL_COL = "EMAIL";
private static final String PASS_COL = "PASS";
private static final String MOBILE_COL = "MOBILE";
private final static int dbVersion = 3;
Context context;
public database(Context context){
super(context,dbName,null,dbVersion);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase = this.getWritableDatabase();
String query = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + ID_COL + " VARCHAR(50) PRIMARY KEY," + NAME_COL + " VARCHAR(50)," + EMAIL_COL + " VARCHAR(50)," + PASS_COL + " VARCHAR(50), "+MOBILE_COL+" VARCHAR(50));";
sqLiteDatabase.execSQL(query);
}
public boolean checkAlreadyExists(){
SQLiteDatabase db = this.getReadableDatabase();
String check = "SELECT * FROM "+tableName+" WHERE ID ="+Id+";";
Cursor cursor = db.rawQuery(check,null);
if(cursor.getCount() > 0){
cursor.close();
return true;
}
else
{
cursor.close();
return false;
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL("DROP TABLE IF EXISTS "+tableName);
onCreate(db);
}
public void addRecord(String id,String name,String email,String pass){
SQLiteDatabase sql = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ID_COL,id);
values.put(NAME_COL,name);
values.put(EMAIL_COL,email);
values.put(PASS_COL,pass);
if(!checkAlreadyExists()) {
long res = sql.insert(tableName,null,values);
if(res==-1) {
Toast.makeText(context, "Registration Failed", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(context,"You Have Been Registered..//",Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(context,"User Already Exists.Please Login.",Toast.LENGTH_LONG).show();
}
}
public boolean login(String loginId,String loginPass){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName,null,ID_COL+" = ? AND "+PASS_COL+" =? ",new String[]{loginId,loginPass},null,null,null);
try
{
if(cursor.moveToFirst())
return true;
}catch(Exception e){
String message = e.getMessage();
Log.v("Database.java","login:"+e.getMessage());
}
finally {
cursor.close();
}
return false;
}
}
这是按下按钮的代码:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.example.myapplication.database.database;
public class RegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initializeUI();
}
private String id;
private int Id;
private String name;
private String pass;
private String email;
private String confirm;
private String mobile;
private EditText NAME;
private EditText PASSWORD;
private EditText CONFIRMPASSWORD;
private EditText EMAIL;
private EditText REGISTER;
private EditText ID;
//Below method initializes the UI.
public void initializeUI(){
ID = (EditText)findViewById(R.id.registerID);
NAME = (EditText) findViewById(R.id.registerName);
PASSWORD = (EditText) findViewById(R.id.registerPassword);
EMAIL = (EditText) findViewById(R.id.registerEmail);
CONFIRMPASSWORD = (EditText) findViewById(R.id.registerConfirmPassword);
}
//Register process gets called.
public void buttonPressed(View view){
database db = new database(RegisterActivity.this);
id = ID.getText().toString();
name = NAME.getText().toString();
email = EMAIL.getText().toString();
pass = PASSWORD.getText().toString();
confirm = CONFIRMPASSWORD.getText().toString();
//Seeing if the password matches.
if (pass.equals(confirm)) {
db.addRecord(id, name, email, pass);
ID.setText("");
NAME.setText("");
EMAIL.setText("");
PASSWORD.setText("");
CONFIRMPASSWORD.setText("");
Intent in = new Intent(RegisterActivity.this,LoginActivity.class);
startActivity(in);
} else {
Toast.makeText(RegisterActivity.this, "Password are Incorrect..//", Toast.LENGTH_LONG).show();
}
}
}
我收到以下异常:
E/AndroidRuntime:致命异常:main 进程:com.example.myapplication,PID:3980 java.lang.IllegalStateException: 无法执行 android:onClick 的方法 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:446) 在 android.view.View.performClick(View.java:5610) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View$PerformClick.run(View.java:22265) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 原因:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441) 在 android.view.View.performClick(View.java:5610) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View$PerformClick.run(View.java:22265) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 原因:java.lang.IllegalStateException:递归调用 getDatabase 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 com.example.myapplication.database.database.onCreate(database.java:28) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 com.example.myapplication.database.database.addRecord(database.java:52) 在 com.example.myapplication.RegisterActivity.buttonPressed(RegisterActivity.java:51) 在 java.lang.reflect.Method.invoke(本机方法) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441) 在 android.view.View.performClick(View.java:5610) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View$PerformClick.run(View.java:22265) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
有人可以帮助我吗?
您应该始终查找异常的 Caused by
部分:
Caused by: java.lang.IllegalStateException: getDatabase called recursively
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.example.myapplication.database.database.onCreate(database.java:28) at
您正在 SQLiteOpenHelper
的 onCreate()
方法中调用 getWritableDatabase()
。不要那样做 - 使用传递给 onCreate()
方法的 sqLiteDatabase
代替:
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String query = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + ID_COL + " VARCHAR(50) PRIMARY KEY," + NAME_COL + " VARCHAR(50)," + EMAIL_COL + " VARCHAR(50)," + PASS_COL + " VARCHAR(50), "+MOBILE_COL+" VARCHAR(50));";
sqLiteDatabase.execSQL(query);
}