Android, ошибка исключения SQLite с неправильным вводом
Извините, нуб в Android.
У меня есть операции с SQLite database
, работает нормально с правильными входами.
Password
работать нормально все время, но когда я поставил неправильно username
, Это означает, insert
когда username
уже существует или select
если имя пользователя не существует, мое приложение завершится с java.lang.NullPointerException
и я действительно не знаю почему и где!
Вот код:
DatabaseOp.java - класс с операцией над БД SQL // проблема в fetchUser()
package sk.tomino.login;
import android.app.Application;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
public class DatabaseOp extends Application
{
protected static final String DATABASE_NAME = "student_diar";
protected static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"CREATE TABLE user (meno varchar NOT NULL, heslo varchar NOT NULL,CONSTRAINT Key1 PRIMARY KEY (meno));"
+ "CREATE TABLE udalost (id int NOT NULL ,meno varchar NOT NULL, typ int NOT NULL, nazov varchar NOT NULL,"
+ "datum date NOT NULL, poznamka varchar, hodina time, dlzka int, poloha varchar,"
+ "CONSTRAINT Key6 PRIMARY KEY (id,meno),CONSTRAINT ma FOREIGN KEY (meno) REFERENCES User (meno));";
public static final String KEY_MENO = "meno";
public static final String KEY_HESLO = "heslo";
private final Context mCtx;
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
/*db.execSQL("CREATE TABLE " + "user" + " ("
+ KEY_MENO + " VARCHAR PRIMARY KEY,"
+ KEY_HESLO + " VARCHAR NOT NULL"
+ ");");*/
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS udalost, user");
onCreate(db);
}
}
public DatabaseOp(Context ctx) {
this.mCtx = ctx;
}
public DatabaseOp open () throws SQLException
{
mDbHelper = new DatabaseHelper (mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close()
{
mDbHelper.close();
}
public long createNote (String nazov, String poznamka)
{
ContentValues initialValues = new ContentValues ();
initialValues.put("nazov", nazov);
initialValues.put("poznamka", poznamka);
//initialValues.put("typ", typ);
return mDb.insert("udalost", null, initialValues);
}
public long createUser (String meno, String heslo)
{
ContentValues initialValues = new ContentValues ();
initialValues.put(KEY_MENO, meno);
initialValues.put(KEY_HESLO, heslo);
return mDb.insert("user", null, initialValues);
}
public boolean deleteNote (long rowId)
{
return mDb.delete("udalost", "id"+"="+rowId, null) > 0;
}
public Cursor fetchAllNotes ()
{
return mDb.rawQuery("select * from udalost;", null);
//return mDb.rawQuery("select * from udalost where typ = 2;", null);
}
public Cursor fetchNote(long rowId) throws SQLException
{
Cursor mCursor = mDb.rawQuery("select * from udalost where id = "+rowId+";", null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchUser(String meno) throws SQLException
{
Cursor mCursor;
//try {
mCursor = mDb.rawQuery("select meno, heslo from user where meno = '"+meno+"';", null);
/*Cursor mCursor = mDb.query(true, "user", new String[]
{KEY_MENO, KEY_HESLO}, KEY_MENO + "= '" + meno + "'", null,
null, null, null, null);*/
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
/*} catch (SQLException e) {
Log.w("student_diar"," - Vyskytla sa chyba so selectom: "+e);
}*/
}
public boolean updateNote(long rowId, String nazov, String poznamka)
{
ContentValues args = new ContentValues();
args.put("nazov", nazov);
args.put("poznamka", poznamka);
return mDb.update("udalost", args, "id" + "=" + rowId, null) > 0;
}
}
LoginActivity.java - Использование Activity // проблема в populateUser()
когда я хочу войти с не существующим аккаунтом
package sk.tomino.login;
import sk.tomino.login.R;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.SQLException;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class LoginActivity extends Activity
{
String username;
EditText e_username;
Boolean login;
String vstupneHeslo;
String vstupnaPrezivka;
private DatabaseOp mDbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
showUserSettings();
mDbHelper = new DatabaseOp(this);
mDbHelper.open();
if (login==false)
loginStart();
}
protected void onPause(Bundle savedInstanceState)
{
mDbHelper.close();
}
public void buttonClicked_log(View button)
{
populateUser();
String heslo = getHeslo();
String prezivka = getPrezivka();
prezivka = prezivka.toLowerCase();
vstupnaPrezivka = vstupnaPrezivka.toLowerCase();
if((prezivka).equals(vstupnaPrezivka))
{
if((heslo).equals(vstupneHeslo)){
startActivity(prezivka);
LoginActivity.this.finish();
} else {
informAboutInvalidHeslo();
}
} else {
informAboutInvalidPrezivka();
}
}
public void populateUser()
{
username = getPrezivka();
if (username != null) {
Cursor cursor = mDbHelper.fetchUser(username);
startManagingCursor(cursor);
vstupnaPrezivka = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseOp.KEY_MENO));
vstupneHeslo = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseOp.KEY_HESLO));
}
}
public void buttonClicked_reg(View button) {
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
//MainActivity.this.startActivity(intent);
LoginActivity.this.finish();
}
protected String getHeslo(){
EditText hesloInput = ((EditText)findViewById(R.id.heslo));
String hesloStr = hesloInput.getText().toString();
return hesloStr;
}
protected String getPrezivka(){
EditText prezivkaInput = ((EditText)findViewById(R.id.login));
String prezivka = prezivkaInput.getText().toString();
return prezivka;
}
protected void informAboutInvalidHeslo(){
Toast.makeText(this, R.string.invalid_heslo, Toast.LENGTH_LONG).show();
EditText hesloInput = ((EditText)findViewById(R.id.heslo));
hesloInput.setText("");
hesloInput.requestFocus();
}
protected void informAboutInvalidPrezivka(){
Toast.makeText(this, R.string.invalid_prezivka, Toast.LENGTH_LONG).show();
EditText prezivkaInput = ((EditText)findViewById(R.id.prezivka));
prezivkaInput.setText("");
prezivkaInput.requestFocus();
}
protected void startActivity(String prezivka){
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.PREZIVKA, prezivka);
startActivity(intent);
}
private void showUserSettings()
{
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this);
username = sharedPrefs.getString("prefUsername", "NULL");
login = sharedPrefs.getBoolean("prefSendReport", false);
e_username = (EditText)findViewById(R.id.login);
e_username.setText(username);
}
public void loginStart ()
{
startActivity(username);
LoginActivity.this.finish();
}
}
RegisterActivity.java - Использование Activity // проблема в populateUser()
тоже при регистрации существующего аккаунта
package sk.tomino.login;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.Toast;
public class RegisterActivity extends Activity
{
private DatabaseOp mDbHelper;
String username;
String vstupnaPrezivka;
LoginActivity l = new LoginActivity ();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.registration);
mDbHelper = new DatabaseOp(this);
mDbHelper.open();
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
protected void onPause(Bundle savedInstanceState)
{
mDbHelper.close();
}
public void buttonClicked_reg(View button)
{
l.populateUser();
String prezivka = getPrezivka();
prezivka = prezivka.toLowerCase();
vstupnaPrezivka = vstupnaPrezivka.toLowerCase();
String heslo = getHeslo();
String heslo2 = getHeslo2();
if(prezivka.matches("") || prezivka.equals(vstupnaPrezivka)){
informAboutInvalidPrezivka();
} else if ((heslo).equals(heslo2)==false || heslo.matches("")) {
informAboutInvalidHeslo();
} else {
startActivity(prezivka, heslo);
}
}
protected String getPrezivka()
{
EditText prezivkaInput = ((EditText)findViewById(R.id.prezivka));
String prezivka = prezivkaInput.getText().toString();
return prezivka;
}
protected String getHeslo()
{
EditText hesloInput = ((EditText)findViewById(R.id.heslo));
String heslo = hesloInput.getText().toString();
return heslo;
}
protected String getHeslo2()
{
EditText hesloInput = ((EditText)findViewById(R.id.heslo2));
String heslo = hesloInput.getText().toString();
return heslo;
}
protected void informAboutInvalidPrezivka()
{
Toast.makeText(this, R.string.reg_problem, Toast.LENGTH_LONG).show();
EditText prezivkaInput = ((EditText)findViewById(R.id.prezivka));
prezivkaInput.setText("");
prezivkaInput.requestFocus();
}
protected void informAboutInvalidHeslo()
{
Toast.makeText(this, R.string.reg_problem2, Toast.LENGTH_LONG).show();
EditText hesloInput = ((EditText)findViewById(R.id.heslo));
hesloInput.setText("");
hesloInput.requestFocus();
}
protected void startActivity (String prezivka, String heslo)
{
mDbHelper.createUser(prezivka, heslo);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.PREZIVKA, prezivka);
startActivity(intent);
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
Editor editor = sharedPrefs.edit();
editor.putString("prefUsername", prezivka);
editor.commit();
RegisterActivity.this.finish();
}
}
LogCat
04-07 10:11:49.330: W/dalvikvm(32578): threadid=1: thread exiting with uncaught exception (group=0x40cc8540)
04-07 10:11:49.350: E/AndroidRuntime(32578): FATAL EXCEPTION: main
04-07 10:11:49.350: E/AndroidRuntime(32578): java.lang.IllegalStateException: Could not execute method of the activity
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.view.View$1.onClick(View.java:3609)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.view.View.performClick(View.java:4102)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.view.View$PerformClick.run(View.java:17085)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.os.Handler.handleCallback(Handler.java:615)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.os.Handler.dispatchMessage(Handler.java:92)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.os.Looper.loop(Looper.java:155)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.app.ActivityThread.main(ActivityThread.java:5520)
04-07 10:11:49.350: E/AndroidRuntime(32578): at java.lang.reflect.Method.invokeNative(Native Method)
04-07 10:11:49.350: E/AndroidRuntime(32578): at java.lang.reflect.Method.invoke(Method.java:511)
04-07 10:11:49.350: E/AndroidRuntime(32578): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
04-07 10:11:49.350: E/AndroidRuntime(32578): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
04-07 10:11:49.350: E/AndroidRuntime(32578): at dalvik.system.NativeStart.main(Native Method)
04-07 10:11:49.350: E/AndroidRuntime(32578): Caused by: java.lang.reflect.InvocationTargetException
04-07 10:11:49.350: E/AndroidRuntime(32578): at java.lang.reflect.Method.invokeNative(Native Method)
04-07 10:11:49.350: E/AndroidRuntime(32578): at java.lang.reflect.Method.invoke(Method.java:511)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.view.View$1.onClick(View.java:3604)
04-07 10:11:49.350: E/AndroidRuntime(32578): ... 11 more
04-07 10:11:49.350: E/AndroidRuntime(32578): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-07 10:11:49.350: E/AndroidRuntime(32578): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
04-07 10:11:49.350: E/AndroidRuntime(32578): at sk.tomino.login.LoginActivity.populateUser(LoginActivity.java:79)
04-07 10:11:49.350: E/AndroidRuntime(32578): at sk.tomino.login.LoginActivity.buttonClicked_log(LoginActivity.java:50)
04-07 10:11:49.350: E/AndroidRuntime(32578): ... 14 more
1 ответ
Перед звонком getString()
на Cursor
, убедитесь, что он указывает на правильную строку. Например, проверьте значение результата из moveToFirst()
: Возвращается true
когда он указывает на действительную строку и false
в противном случае (т.е. курсор не имеет строк).