Возникла ошибка при входе пользователя в систему, а не в базе - PullRequest
0 голосов
/ 09 марта 2019

Я получил ошибку, когда попытался войти в систему с неверными учетными данными, я ожидал, что при получении тостовой ошибки будет введена неправильная учетная запись, но она вылетит.

Я думаю, что мой помощник базы данных останавливается, когда не может найти пользователей email_phone и пароль. и не отправляет функцию запрета на мою ошибку входа в систему ..

что такое отрицательная функция или что-то, чего мне не хватает

вот мой logcat

03-09 03:01:09.047 16124-16124/edu.angelo.parentsportal E/SQLiteLog: (1) no such column: parent
03-09 03:01:09.048 16124-16124/edu.angelo.parentsportal E/AndroidRuntime: FATAL EXCEPTION: main
Process: edu.angelo.parentsportal, PID: 16124
android.database.sqlite.SQLiteException: no such column: parent (code 1): , while compiling: select * from Parents_Table where (EMAIL_ADDRESS = parent OR PHONE_NUMBER = parent) AND PASSWORD = 123456
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
    at edu.angelo.parentsportal.DatabaseHelper.userExistance(DatabaseHelper.java:120)
    at edu.angelo.parentsportal.Login.userLogin(Login.java:86)
    at edu.angelo.parentsportal.Login.onClick(Login.java:50)
    at android.view.View.performClick(View.java:4780)
    at android.view.View$PerformClick.run(View.java:19866)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

my DatabaseHelper

package edu.angelo.parentsportal;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

public class DatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "Parents_Portal.db";
public static final String TABLE_NAME = "Parents_Table";
public static final String COL_0 = "ID";
public static final String COL_1 = "NAME";
public static final String COL_2 = "SURNAME";
public static final String COL_3 = "EMAIL_ADDRESS";
public static final String COL_4 = "PHONE_NUMBER";
public static final String COL_5 = "PASSWORD";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);

}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME +"(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, SURNAME TEXT, EMAIL_ADDRESS TEXT, PHONE_NUMBER TEXT, PASSWORD TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}

public boolean insertData(String name, String surname, String email_address, String phone_number, String password){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_1,name);
    contentValues.put(COL_2,surname);
    contentValues.put(COL_3,email_address);
    contentValues.put(COL_4,phone_number);
    contentValues.put(COL_5,password);
    long result = db.insert(TABLE_NAME, null , contentValues);
    if (result == -1) {
        return false;
    }
    else {
        return true;
    }
}

public ArrayList<ParentModel> getAllParentsData(){
    ArrayList<ParentModel> list = new ArrayList<>();
    String sql = "select * from " + TABLE_NAME;
    SQLiteDatabase mydb = this.getWritableDatabase();
    Cursor cursor = mydb.rawQuery(sql, null);
    if (cursor.moveToFirst()) {
        do {
            ParentModel parentModel = new ParentModel();
            parentModel.setID(cursor.getString(0));
            parentModel.setName(cursor.getString(1));
            parentModel.setSurname(cursor.getString(2));
            parentModel.setEmail(cursor.getString(3));
            parentModel.setPhone_number(cursor.getString(4));
            parentModel.setPassword(cursor.getString(5));
            list.add(parentModel);
        }
        while (cursor.moveToNext());
    }
    return list;
}

public void updateData(int id, String name , String surname , String email , String phone_number , String password){
   ContentValues contentValues = new ContentValues();
    contentValues.put(COL_1, name);
    contentValues.put(COL_2, surname);
    contentValues.put(COL_3, email);
    contentValues.put(COL_4, phone_number);
    contentValues.put(COL_5, password);

    SQLiteDatabase mydb = this.getWritableDatabase();
    mydb.update(TABLE_NAME, contentValues, COL_0 + "=" + id, null);
    mydb.close();
}

public void deleteParent(int id){
    SQLiteDatabase mydb = this.getWritableDatabase();
    mydb.delete(TABLE_NAME, COL_0 + "=" + id, null);
    mydb.close();
}


public ArrayList<ParentModel> getParentLoginData(String emailOrPhone,String password){
    ArrayList<ParentModel> list = new ArrayList<>();
    String sql = "SELECT * FROM " + TABLE_NAME+" WHERE ("+COL_3+"= "+emailOrPhone+" OR "+COL_4 +" = "+emailOrPhone+") AND "+COL_5 +" = "+ password;
    SQLiteDatabase mydb = this.getWritableDatabase();
    Cursor cursor = mydb.rawQuery(sql, null);
    if (cursor.getCount() > 0) {
        do {
            ParentModel parentModel = new ParentModel();
            parentModel.setID(cursor.getString(0));
            parentModel.setName(cursor.getString(1));
            parentModel.setSurname(cursor.getString(2));
            parentModel.setEmail(cursor.getString(3));
            parentModel.setPhone_number(cursor.getString(4));
            parentModel.setPassword(cursor.getString(5));
            list.add(parentModel);
        }
        while (cursor.moveToNext());
    }
    return list;
}

public boolean userExistance(String emailOrPhone, String pwd) {
    String sql = "select * from " + TABLE_NAME + " where (" + COL_3 + " = " + emailOrPhone + " OR " + COL_4 + " = " + emailOrPhone + ") AND " + COL_5 + " = " + pwd;
    SQLiteDatabase mydb = this.getWritableDatabase();
    Cursor cursor = mydb.rawQuery(sql, null);

    if (cursor.getCount() > 0) {
        do {
            ArrayList<ParentModel> list = new ArrayList<>();
            ParentModel parentModel = new ParentModel();
            parentModel.setID(cursor.getString(0));
            parentModel.setName(cursor.getString(1));
            parentModel.setSurname(cursor.getString(2));
            parentModel.setEmail(cursor.getString(3));
            parentModel.setPhone_number(cursor.getString(4));
            parentModel.setPassword(cursor.getString(5));
            list.add(parentModel);
        }
        while (cursor.moveToNext());
        return true;
    }

    else{
        return false;
    }

}
}

Мой логинДеятельность

public class Login extends AppCompatActivity implements View.OnClickListener {

private EditText editTextEmailPhone;
private EditText editTextPassword;
private Button Login;
private ProgressDialog progressDialog;
DatabaseHelper mydb;
SQLiteDatabase sqLiteDatabase;
ParentModel parentModel;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);


    editTextEmailPhone = findViewById(R.id.input_username);
    editTextPassword = findViewById(R.id.input_password);
    findViewById(R.id.btn_register).setOnClickListener(Login.this);

    progressDialog = new ProgressDialog(this);

    mydb = new DatabaseHelper(this);
    sqLiteDatabase = mydb.getReadableDatabase();
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.btn_register: {
            userLogin();
            break;
        }

    }


}


private void userLogin() {
    String email = editTextEmailPhone.getText().toString().trim();
    String password = editTextPassword.getText().toString().trim();

    if (email.isEmpty()) {
        editTextEmailPhone.setError("Email or Phone Number is required");
        editTextEmailPhone.requestFocus();
        return;
    }

    if (password.isEmpty()) {
        editTextPassword.setError("Password is required");
        editTextPassword.requestFocus();
        return;
    }
    if (password.length()<6 ){
        editTextPassword.setError("Minimum of length of password should be 6");
        editTextPassword.requestFocus();
        return;
    }
    //if the email&pass is not empty
    else{
        progressDialog.setMessage("Please Wait...");
        progressDialog.show();

        boolean exists = mydb.userExistance(email, password);
        if(true)
        {
            progressDialog.dismiss();
            SharedPrefs.saveSharedSetting(this, "NoAccount", "false");
            Intent intent = new Intent(Login.this, Parent_Home.class);

            String parentID;
            String parentName;
            String parentSurname;
            parentID = parentModel.getID();
            parentName = parentModel.getName();
            parentSurname = parentModel.getSurname();

            //Change to prefs
            //intent.putExtra("Ik_CurrentParentID",parentModel.getID());
           // intent.putExtra("Ik_CurrentParentName",parentModel.getName());
           // intent.putExtra("Ik_CurrentParentSurname",parentModel.getSurname());
           // Toast.makeText(this, "Welcome" + parentName, Toast.LENGTH_SHORT).show();
            startActivity(intent);
            finish();
        }
        else {
            Toast.makeText(getApplicationContext(), "Login error", Toast.LENGTH_SHORT).show();
            progressDialog.dismiss();
            return;
        }
    }
}

}

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Причина в том, что, поскольку parent не заключен в одинарные кавычки, он рассматривается как идентификатор (в данном случае имя столбца, которое можно сравнить со столбцом через его имя, отсюда и сообщение) .

1. Быстрое, но не очень хорошее решение.

Похоже, у вас есть три таких экземпляра, чтобы вы могли изменить: -

String sql = "select * from " + TABLE_NAME + " where (" + COL_3 + " = " + emailOrPhone + " OR " + COL_4 + " = " + emailOrPhone + ") AND " + COL_5 + " = " + pwd;

будет

String sql = "select * from " + TABLE_NAME + " where (" + COL_3 + " = '" + emailOrPhone + "' OR " + COL_4 + " = '" + emailOrPhone + "') AND " + COL_5 + " = '" + pwd + "'";

2. Лучшее исправление, но все же некоторые потенциальные проблемы (см. Следующее исправление)

Однако, если значения для сравнения должны быть введены пользователем. Это оставляет приложение открытым для SQL-инъекций (ввода вредоносных команд посредством ввода), поэтому предлагается использовать второй параметр метода rawQuewry для передачи массива значений String, который будет заменять по одному на каждый элемент? запрос.

Таким образом, было бы безопаснее использовать: -

String sql = "select * from " + TABLE_NAME + " where (" + COL_3 + " = ? OR " + COL_4 + " =?) AND " + COL_5 + " =? ";
String[] args = new String[]{emailOrPhone,emailOrPhone,pwd};
SQLiteDatabase mydb = this.getWritableDatabase();
Cursor cursor = mydb.rawQuery(sql,args);

3. Лучше исправить.

Однако существуют удобные методы, такие как query (вы использовали удобный метод обновления), которые считаются лучше, чем использование rawQuery, где это возможно.

Вспомогательные методы создают базовый SQL. Таким образом, рекомендуемый способ будет использовать: -

public boolean userExistance(String emailOrPhone, String pwd) {

    SQLiteDatabase mydb = this.getWritableDatabase();
    String whereclause = "(" + COL_3 + "=? OR " + COL_4 + "=?) AND " + COL_5 + "=?";
    String[] whereargs = new String[]{emailOrPhone,emailOrPhone,pwd}    
    Cursor cursor = mydb.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
    boolean rv = cusror.getCount() > 0;
    cursor.close();
    return rv;
}
  • Обратите внимание, что это также было изменено, чтобы избавиться от ненужного и потенциально опасного кода.
  • Курсор закрывается, если оставить слишком много Курсоров открытым, приложение будет аварийно завершено, поэтому не рекомендуется закрывать Курсоры при их использовании.
  • Нет необходимости перебирать курсор и извлекать данные, как все, что вы хотите знать, если какие-либо строки были возвращены. Таким образом, счетчик используется для установки возвращаемого значения в true или false, курсор закрывается и возвращается логическое значение.
  • Возможно, вы захотите взглянуть на SQLiteDatabase - запрос

Обратите внимание, что приведенный выше является принципиальным кодом, он не был проверен или запущен и поэтому может содержать некоторые ошибки.

Следует также отметить, что у вас будет похожая проблема с getParentLoginData, поскольку предложение SELECT очень похоже на .

0 голосов
/ 09 марта 2019

Я думаю, вам нужно добавить один (') до и после emailOrPhone, потому что это тип символов.и запрос будет выглядеть так:

String sql = "select * from " + TABLE_NAME + " where (" + COL_3 + " = '" + emailOrPhone + "' OR " + COL_4 + " = '" + emailOrPhone + "') AND " + COL_5 + " = " + pwd;

для получения дополнительной информации вы можете проверить эту проблему: sqlite вернул: код ошибки = 1, msg = нет такого столбца: кухня1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...