База данных отображается пустой, но вход выполнен успешно - PullRequest
0 голосов
/ 17 июня 2019

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

Однако проблема заключается в том, что всякий раз, когда я открываюбаза данных, она всегда пуста!Несмотря на то, что приложение позволяет мне войти в систему с только что созданной учетной записью.

Мне удалось дважды просмотреть результаты в базе данных, но я не представляю, как мне это удалось.Но в большинстве случаев он просто открывается с таблицами, но без результатов

package com.example.finalyearproject;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class userDatabase
extends SQLiteOpenHelper {

public static String DATABASE_NAME = "User.db";
public static int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "user_table";
public static final String COL_ID = "ID";
public static final String COL_USERNAME = "USERNAME";
public static final String COL_EMAIL = "EMAIL";
public static final String COL_PASSWORD = "PASSWORD";

public userDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME +"(" +
            COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL_USERNAME + " text, " +
            COL_PASSWORD + " text, " +
            COL_EMAIL + " text " +
            ")";
    db.execSQL(sql);
}


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

public boolean create (Account account) {
    boolean result = true;
    try
    {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_USERNAME, account.getUsername());
        contentValues.put(COL_EMAIL, account.getEmail());
        contentValues.put(COL_PASSWORD, account.getPassword());
        result = db.insert(TABLE_NAME, null, contentValues) > 0;
    } catch (Exception e) {
        result = false;
    }
    return result;
}

public Account login(String username, String password) {
    Account account = null;
    try {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from " + TABLE_NAME +
                " where username = ? and password = ?",
                new String[]{username, password});

        if (cursor.moveToFirst()) {
            account = new Account();
            account.setId(cursor.getInt(0));
            account.setUsername(cursor.getString(1));
            account.setEmail(cursor.getString(2));
            account.setPassword(cursor.getString(3));
        }
    } catch (Exception e) {
        account = null;
    }
    return account;
}

public Account checkUsername(String username) {
    Account account = null;
    try {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from " + TABLE_NAME +
                        " where username = ?",
                new String[]{username});

        if (cursor.moveToFirst()) {
            account = new Account();
            account.setId(cursor.getInt(0));
            account.setUsername(cursor.getString(1));
            account.setEmail(cursor.getString(2));
            account.setPassword(cursor.getString(3));
        }
    } catch (Exception e) {
        account = null;
    }
        return account;
}

}

А вот код моей регистрационной формы

    import android.content.DialogInterface;
    import android.content.Intent;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;

public class SignUp extends AppCompatActivity implements View.OnClickListener {

userDatabase myDb;

private EditText editUser, editPassword, editEmail, editCpassword;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);
    setTitle("Sign Up");
    myDb = new userDatabase(this);
    editUser = findViewById(R.id.editSignUpUser);
    editPassword = findViewById(R.id.editSignUpPassword);
    editEmail = findViewById(R.id.editSignUpEmail);
    editCpassword = findViewById(R.id.editConfirmpassword);
    Button buttonRegister = findViewById(R.id.buttonRegister);
    buttonRegister.setOnClickListener(SignUp.this);
}


@Override
public void onClick(View v) {
    if (v.getId() == R.id.buttonRegister) {
        try {
            userDatabase userDatabase = new userDatabase(getApplicationContext());
            Account account = new Account();
            account.setEmail(editEmail.getText().toString());
            account.setPassword(editPassword.getText().toString());
            account.setUsername(editUser.getText().toString());
            Account temp = userDatabase.checkUsername(editUser.getText().toString());

            if (temp == null) {
                if (userDatabase.create(account)) {
                    Intent intent = new Intent(SignUp.this, MainActivity.class);
                    startActivity(intent);
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                    builder.setTitle("Error");
                    builder.setMessage("Can not Create");
                    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int which) {
                            dialogInterface.cancel();
                        }
                    });
                    builder.show();
                }
            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle("Error");
                builder.setMessage("Username Exists");
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int which) {
                        dialogInterface.cancel();
                    }
                });
                builder.show();

            }

        } catch (Exception e) {
            AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            builder.setTitle("Error");
            builder.setMessage(e.getMessage());
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                    dialogInterface.cancel();
                }
            });
            builder.show();
        }
    }
}

}

А вот и мой MainActivity

public class MainActivity extends AppCompatActivity
implements View.OnClickListener {


private EditText editLoginUsername;
private EditText editLoginPassword;
private Button ButtonLectureLogin;
private Button ButtonStudentLogin;
private Button ButtonSignUp;



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

    editLoginUsername = findViewById(R.id.editLoginUser);
    editLoginPassword = findViewById(R.id.editLoginPassword);

    Button button = findViewById(R.id.buttonStudentLogin);
    button.setOnClickListener(MainActivity.this);
    button = findViewById(R.id.buttonLecturerLogin);
    button.setOnClickListener(MainActivity.this);
    button = findViewById(R.id.buttonSignUp);
    button.setOnClickListener(MainActivity.this);

}

@Override
public void onClick(View v) {

    if (v.getId()==R.id.buttonSignUp) {
        Intent intent  = new Intent(
                MainActivity.this,
                SignUp.class);

        startActivity(intent);
    }

    else if (v.getId()==R.id.buttonLecturerLogin) {
        userDatabase userDatabase = new userDatabase(getApplicationContext());
        String username = editLoginUsername.getText().toString();
        String password = editLoginPassword.getText().toString();
        Account account = userDatabase.login(username, password);

        if (account == null) {
            AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            builder.setTitle("Error");
            builder.setMessage("Invalid Account");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                    dialogInterface.cancel();
                }
            });
            builder.show();
        } else {
            Intent intent = new Intent(MainActivity.this, Lecturer.class);
            intent.putExtra("Account", account);
            startActivity(intent);
        }
    }

    else if (v.getId()==R.id.buttonStudentLogin) {
        //code for when button is pressed, checks database then redirects accordingly
    }

}

}

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

1 Ответ

0 голосов
/ 17 июня 2019

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

всякий раз, когда я открываю базу данных, она всегда пуста!

То есть, вы копируете ваш код в том виде, в котором он поставляется, а затем добавляете MainActivity.java согласно: -

public class MainActivity extends AppCompatActivity {
    userDatabase myDb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDb = new userDatabase(this);

        DatabaseUtils.dumpCursor(
                myDb.getWritableDatabase()
                        .query(userDatabase.TABLE_NAME,null,null,null,null,null,null)
        );

        Account a = myDb.login("Fred","password");
        Log.d(
                "ACCOUNTINFO",
                "Username = " + a.getUsername() +
                        " Email = " + a.getEmail() +
                        " Password = " + a.getPassword() +
                        " ID=" + String.valueOf(a.getId())
        );
    }
}

т.е. буквальный сброс курсора после регистрации с помощью: -

  • имя пользователя как Фред
  • электронная почта: fred@fredmail.com
  • пароль как пароль
  • подтвердить пароль как пароль

Выходные данные в журнале: -

2019-06-17 22:20:14.653 15017-15017/aso.so56626957signin I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@1b21f
2019-06-17 22:20:14.653 15017-15017/aso.so56626957signin I/System.out: 0 {
2019-06-17 22:20:14.653 15017-15017/aso.so56626957signin I/System.out:    ID=1
2019-06-17 22:20:14.653 15017-15017/aso.so56626957signin I/System.out:    USERNAME=Fred
2019-06-17 22:20:14.654 15017-15017/aso.so56626957signin I/System.out:    PASSWORD=password
2019-06-17 22:20:14.654 15017-15017/aso.so56626957signin I/System.out:    EMAIL=fred@fredmail.com
2019-06-17 22:20:14.654 15017-15017/aso.so56626957signin I/System.out: }
2019-06-17 22:20:14.654 15017-15017/aso.so56626957signin I/System.out: <<<<<
2019-06-17 22:20:14.656 15017-15017/aso.so56626957signin D/ACCOUNTINFO: Username = Fred Email = password Password = fred@fredmail.com ID=1

Вывод таков: весь приведенный выше код работает. Возможно, вы захотите попробовать приведенный выше код в вашем файле MainActivity.java.

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

Также рекомендуется не жестко кодировать имена столбцов, а использовать вместо них константы, а также использовать метод query вместо метода rawQuery (когда это возможно)

Поэтому предлагается изменить: -

public Account login(String username, String password) {
    Account account = null;
    try {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from " + TABLE_NAME +
                        " where username = ? and password = ?",
                new String[]{username, password});

        if (cursor.moveToFirst()) {
            account = new Account();
            account.setId(cursor.getInt(0));
            account.setUsername(cursor.getString(1));
            account.setEmail(cursor.getString(2));
            account.setPassword(cursor.getString(3));
        }
    } catch (Exception e) {
        account = null;
    }
    return account;
}

до: -

public Account login(String username, String password) {
    Account account = null;
    try {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.query(
                TABLE_NAME,
                null,
                COL_USERNAME + "=? AND " + COL_PASSWORD + "=?",
                new String[]{username,password},
                null,null,null
        );
        if (cursor.moveToFirst()) {
            account = new Account();
            account.setId(cursor.getInt(cursor.getColumnIndex(COL_ID)));
            account.setUsername(cursor.getString(cursor.getColumnIndex(COL_USERNAME)));
            account.setEmail(cursor.getString(cursor.getColumnIndex(COL_EMAIL)));
            account.setPassword(cursor.getString(cursor.getColumnIndex(COL_PASSWORD)));
        }
    } catch (Exception e) {
        account = null;
    }
    return account;
}

И аналогично используйте: -

public Account checkUsername(String username) {
    Account account = null;
    try {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.query(
                TABLE_NAME,
                null,
                COL_USERNAME + "=?",
                new String[]{username},
                null,null,null
        );
        if (cursor.moveToFirst()) {
            account = new Account();
            account.setId(cursor.getInt(cursor.getColumnIndex(COL_ID)));
            account.setUsername(cursor.getString(cursor.getColumnIndex(COL_USERNAME)));
            account.setEmail(cursor.getString(cursor.getColumnIndex(COL_EMAIL)));
            account.setPassword(cursor.getString(cursor.getColumnIndex(COL_PASSWORD)));
        }
    } catch (Exception e) {
        account = null;
    }
    return account;
}

Это приводит к: -

2019-06-17 22:37:08.273 15361-15361/aso.so56626957signin D/ACCOUNTINFO: Username = Fred Email = fred@fredmail.com Password = password ID=1

Дополнительный комментарий

я собираюсь включить свою основную деятельность в пост тоже

Короче говоря, это не имеет большого значения для ответа, код работает. Так что это то, что заставляет вас говорить

всякий раз, когда я открываю базу данных, она всегда пуста!

Вот в чем проблема.

  • Примечание после комментирования строки //intent.putExtra("Account ", account);

Это можно доказать, изменив обработку имени входа в методе MainActivity onCLick согласно: -

@ Override public void onClick (View v) {

    if (v.getId()==R.id.buttonSignUp) {
        Intent intent  = new Intent(
                MainActivity.this,
                SignUp.class);
        startActivity(intent);
    }

    else if (v.getId()==R.id.buttonLecturerLogin) {
        userDatabase userDatabase = new userDatabase(getApplicationContext());
        String username = editLoginUsername.getText().toString();
        String password = editLoginPassword.getText().toString();
        Account account = userDatabase.login(username, password);

        if (account == null) {
            AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            builder.setTitle("Error");
            builder.setMessage("Invalid Account");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                    dialogInterface.cancel();
                }
            });
            builder.show();
        } else {
            Intent intent = new Intent(MainActivity.this, Lecturer.class);
            //intent.putExtra("Account", account);
            startActivity(intent);
        }
    }

    else if (v.getId()==R.id.buttonStudentLogin) {


        userDatabase myDb = new userDatabase(v.getContext()); //<<<<<<<<<< ADDED
        //Extract all users and dump them to the log
        DatabaseUtils.dumpCursor(
                myDb.getWritableDatabase()
                        .query(userDatabase.TABLE_NAME,null,null,null,null,null,null)
        );
        //LOGIN ATTEMPT
        Account a = myDb.login(editLoginUsername.getText().toString(),editLoginPassword.getText().toString()); //<<<<<<<<<< attempt to login is here
        String loginresult = "Failed"; // Default value
        if (a != null) {
            loginresult = "Worked."; // value set to worked if the login worked
        }
        Log.d("LOGINRESULT","The attempt to login " + loginresult); //<<<<<<< write result of the login attempt to the log
        //code for when button is pressed, checks database then redirects accordingly
    }
}

Используя одно и то же имя пользователя Фред и пароль пароль , а затем нажав кнопку входа в систему, вы получите: -

06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@49e1d9f
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out: 0 {
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out:    ID=1
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out:    USERNAME=Fred
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out:    PASSWORD=password
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out:    EMAIL=fred@fredmail.com
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out: }
06-18 07:09:24.314 1881-1881/aso.so56626957signin I/System.out: <<<<<
06-18 07:09:24.314 1881-1881/aso.so56626957signin D/LOGINRESULT: The attempt to login Worked.

Попытка входа учащегося с другими учетными данными приведет к: -

06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@6bcb36d
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out: 0 {
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out:    ID=1
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out:    USERNAME=Fred
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out:    PASSWORD=password
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out:    EMAIL=fred@fredmail.com
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out: }
06-18 07:09:34.264 1881-1881/aso.so56626957signin I/System.out: <<<<<
06-18 07:09:34.265 1881-1881/aso.so56626957signin D/LOGINRESULT: The attempt to login Failed

т.е. первое показывает, что есть данные

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