Проверка имени пользователя и пароля в SQLite - PullRequest
0 голосов
/ 12 марта 2019

Я создаю логин, подключенный к SQLite в Android Studio. Я хочу перейти ко второму действию, если имя пользователя и пароль верны (конечно, оба хранятся в базе данных). Пользователи могут быть добавлены с моей страницы администратора, которая работает нормально. Как я могу проверить, хранятся ли имя пользователя и пароль в базе данных?

Вот мой код:

Основная деятельность:

package com.example.schoolapp;

import android.content.Intent;
import android.se.omapi.Session;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.schoolapp.Admin.DBHelper;
import com.example.schoolapp.Admin.ThirdActivity;
import com.example.schoolapp.Eleve.SecondActivity;


public class MainActivity extends AppCompatActivity {
    DBHelper SchoolAppDB;

    //Initialisation des variables
    private EditText Name;
    private EditText Password;
    private Button Login;

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

        //Mise en relation des variables a leurs correspondants dans le fichier XML par leur ID
        Name = (EditText) findViewById(R.id.etNewName);
        Password = (EditText) findViewById(R.id.etPassword);
        Login = (Button) findViewById(R.id.btnLogin);

        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                //getting Edit Text values and stores it into string
                String username = Name.getText().toString();
                String password = Password.getText().toString();

                //check authorized user or not

                if (SchoolAppDB.checkUser(username, password)) {
                    Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                    startActivity(intent);
                    Toast.makeText(getApplicationContext(), "Login Successfull", Toast.LENGTH_LONG).show();


                } else {
                    Toast.makeText(getApplicationContext(), "Wrong Username or Password", Toast.LENGTH_LONG).show();
                }


            }

        });

    }
}

DBHelper checkUserLogin метод:

public boolean checkUserLogin(String username,String password){
        SQLiteDatabase db=this.getWritableDatabase();
        String Query = "select USER_NAME, USER_PASSWORD from USER where USER_NAME='"+ username +"' and USER_PASSWORD='"+ password+"'";
        Cursor cursor = null;

        try {
            cursor = db.rawQuery(Query, null);//raw query always holds rawQuery(String Query,select args)
        } catch (Exception e) {
            e.printStackTrace();
        }

        if(cursor!=null && cursor.getCount()>0){
            cursor.close();
            return true;
        }
        else{
            cursor.close();
            return false;
        }

    }

1 Ответ

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

Вероятно, вы получаете исключение с нулевым указателем, поскольку вы, похоже, не создали его экземпляр SchoolAppDB .

Я бы предложил изменить: -

setContentView(R.layout.activity_main);

быть: -

setContentView(R.layout.activity_main);
SchoolAppDB = new DBHelper(this); //<<<<<<<<<< assuming the DBHelper constructor only requires the Context.

Полагаю, вы хотите if (SchoolAppDB.checkUserLogin(username, password)) {, а не if (SchoolAppDB.checkUser(username, password)) {.

Дополнительный

  • Непосредственное размещение введенных пользователем данных в SQL делает приложение открытым для SQL-инъекция .

  • Проверка курсора на нулевое значение, когда курсор возвращается из метода SQliteDatabase, такого как rawQuery , бесполезен. Курсор никогда не будет нулевым, если не будет возвращено ни одной строки, он будет пустым.

Не рекомендуется размещать вызовы методов SQLiteDatabase в предложениях try / catch, поскольку серьезная проблема может быть скрыта.

  • Существуют удобные методы для часто используемого SQL, которые облегчают жизнь, чем использование rawQuery и execSQL. Они создают базовый SQL, защиту от SQL-инъекций (rawQuery также делает, если вы используете 2-й параметр, чтобы предоставить String [] аргументов для замены ? placehoders).

В качестве такового предлагается рассмотреть следующий метод checkUserLogin , который использует удобный метод query : -

public boolean checkUserLogin(String username,String password){
    SQLiteDatabase db=this.getWritableDatabase();
    String whereclause = "USER_NAME=? and USER_PASSWORD=?"; //<<<<<<<<<< ?'s will be replaced according to whereargs on a 1 by 1 basis
    String[] whereargs = new String[]{username,password};
    Cursor cursor = db.query(
            "USER",
            new String[]{"USER_NAME","USER_PASSWORD"},
            whereclause,
            whereargs,
            null,null,null
            );
    int count = cursor.getCount();
    cursor.close();
   return count > 0;
}
...