Я считаю, что ваша проблема в том, какой метод вы используете, чтобы прийти к выводу, который заставляет вас сказать
всякий раз, когда я открываю базу данных, она всегда пуста!
То есть, вы копируете ваш код в том виде, в котором он поставляется, а затем добавляете 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
т.е. первое показывает, что есть данные