문제

Sorry, noob in Android.

I have operations with SQLite database, working fine with correct inputs.

Password work fine alltimes, but when i put wrong username. That means, insert when username is already exists or select when username dont exist, my app will crash with java.lang.NullPointerException and i really dont know why and where !

Here's a code:

DatabaseOp.java - class with operation on SQL DB // problem in 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 - Using Activity // problem in populateUser() when i want log in with not exist account

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 - Using Activity // problem in populateUser() too when registering existing account

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
도움이 되었습니까?

해결책

Before calling getString() on a Cursor, make sure it is pointing to a valid row. For example, check the result value from moveToFirst(): It returns true when it's pointing to valid row and false otherwise (i.e. the cursor has no rows).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top