0

Building a basic sqlite based login/sign up app. App crashes after hitting login.

Any thoughts?

DatabaseHelper.java:

   package com.example.android.sqliteapp;

   import android.content.ContentValues;
   import android.content.Context;
   import android.database.Cursor;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteOpenHelper;

 public class DatabaseHelper extends SQLiteOpenHelper {

// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "contacts.db";

// User table name
private static final String TABLE_NAME = "contacts";

// User Table Columns names
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_EMAIL = "email";
private static final String COLUMN_UNAME = "uname";
private static final String COLUMN_PASS = "pass";
SQLiteDatabase db;

// create table sql query
private static final String TABLE_CREATE = "create table contacts (id integer primary key not null , " +
        "name text not null, email text not null, uname text not null, pass text not null)";

// constructor
public DatabaseHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(TABLE_CREATE);
    this.db = db;
}

// inserting data from SignUp to DB
public void insertContact(Contact c){
    db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    String query = "select * from " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    int count = cursor.getCount();

    values.put(COLUMN_ID, count);    // each contact will have unique IDs counting from 0 upwards
    values.put(COLUMN_NAME, c.getName());
    values.put(COLUMN_EMAIL, c.getEmail());
    values.put(COLUMN_UNAME, c.getUname());
    values.put(COLUMN_PASS, c.getPass());

    db.insert(TABLE_NAME, null, values); // this will officially insert the contact object into the DB
    db.close(); // close it
}

// this is where the search password method is created
public String searchPass(String uname) {
    db = this.getReadableDatabase();
    String query = "select * from " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    String a, b;
    b = "not found";
    if (cursor.moveToFirst()) {

        do {
            a = cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));

            if (a.equals(uname)) {
                b = cursor.getString(cursor.getColumnIndex(COLUMN_PASS));
                break;
            }
        }
        while(cursor.moveToNext());
    }
    return b; // b is the returned password
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    //Drop User Table if exist
    String query = "DROP TABLE IF EXISTS " + TABLE_NAME;
    db.execSQL(query);
    // Create tables again
    this.onCreate(db);
}
}

The app is now crashing after hitting login

Error Log:

05-11 06:27:30.850 3471-3471/com.example.android.sqliteapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.sqliteapp, PID: 3471 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5637) at android.view.View$PerformClick.run(View.java:22429) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5637)  at android.view.View$PerformClick.run(View.java:22429)  at android.os.Handler.handleCallback(Handler.java:751)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6119)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.android.sqliteapp/com.example.android.sqliteapp.Display}; have you declared this activity in your AndroidManifest.xml? at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523) at android.app.Activity.startActivityForResult(Activity.java:4225) at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) at android.app.Activity.startActivityForResult(Activity.java:4183) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) at android.app.Activity.startActivity(Activity.java:4522) at android.app.Activity.startActivity(Activity.java:4490) at com.example.android.sqliteapp.MainActivity.onButtonClick(MainActivity.java:36) at java.lang.reflect.Method.invoke(Native Method)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  at android.view.View.performClick(View.java:5637)  at android.view.View$PerformClick.run(View.java:22429)  at android.os.Handler.handleCallback(Handler.java:751)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6119)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

MainActivity Java:

package com.example.android.sqliteapp;

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

public class MainActivity extends AppCompatActivity {

DatabaseHelper helper = new DatabaseHelper(this);

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

public void onButtonClick(View v) {

    // if user clicks on LOGIN
    if (v.getId() == R.id.bLogin) {

        // Grab all Username and Password input
        EditText a = (EditText) findViewById(R.id.etUsername);
        String str = a.getText().toString();
        EditText b = (EditText) findViewById(R.id.etPassword);
        String pass = b.getText().toString();

        String password = helper.searchPass(str);
        if (pass.equals(password)) {

            Intent i = new Intent(MainActivity.this, Display.class);
            i.putExtra("Username", str);
            startActivity(i);
        }
        else {
            Toast temp = Toast.makeText(MainActivity.this, "Username and Password don't match!", Toast.LENGTH_SHORT);
            temp.show();

        }


    }

    if (v.getId() == R.id.bSignup) {

        Intent i = new Intent(MainActivity.this, SignUp.class);
        startActivity(i);
    }


}




}

Display.java:

package com.example.android.sqliteapp;

import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class Display extends AppCompatActivity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display);

    String username = getIntent().getStringExtra("Username");
    TextView tv = (TextView) findViewById(R.id.tvUsername);
    tv.setText(username);


}
}

Contact.java:

package com.example.android.sqliteapp;


public class Contact {

private int id;
private String name;
private String email;
private String uname;
private String pass;

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return this.email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getUname() {
    return this.uname;
}

public void setUname(String uname) {
    this.uname = uname;
}

public String getPass() {
    return this.pass;
}

public void setPass(String pass) {
    this.pass = pass;
}



}
Kalid
  • 23
  • 6
  • 2
    As far as I can see, index 2 is not `uname`. If you use `SELECT *` you also get the `id`, meaning that `uname` will be in column 3 – 0xDEADC0DE May 11 '17 at 09:50
  • error is regarding something else, from where you're calling onButtonClick() ? – Rajesh Panchal May 11 '17 at 11:00
  • It is generally better to post a new question, if you are having a new issue. As you otherwise make all answers incorrect as the question has changed. See below for my answer to your new problem. – IAmGroot May 11 '17 at 11:20

2 Answers2

1

Change you searchPass() method as like below:

public String searchPass(String uname) {
db = this.getReadableDatabase();
String query = "select * from " + TABLE_NAME;
Cursor cursor = db.rawQuery(query, null);
String a, b;
b = "not found";
if (cursor.moveToFirst()) {

    do {
        a = cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));
        if (a.equals(uname)) {

            b = cursor.getString(cursor.getColumnIndex(COLUMN_PASS));
            break;
        }
    }
    while(cursor.moveToNext());
 }
 return b; // b is the returned password
}

as your uname's index is 3 and index of pass is 4

Rajesh Panchal
  • 1,140
  • 3
  • 20
  • 39
  • I did as you said, now the app crashes after hitting login button. Could this revert to other activity issues? – Kalid May 11 '17 at 10:05
  • Sure. Please kindly see my edited post with error logs. Thank you! – Kalid May 11 '17 at 10:39
1

You should really pass in the name of the column and obtain its index, rather than index directly.

change

cursor.getString(2);

to

cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));

And so on so forth. This makes it more versitile should the table or query be changed in any way.

On a side note, you should change your query so that it returns just one matching record, to that user name. Rather than all records, then looping through to find the matching one.

e.g.

String query = "select * from " + TABLE_NAME + " WHERE uname = " + uname;

Edit: for your second error you are getting ActivityNotFoundException. In the logs it clearly states have you declared this activity in your AndroidManifest.xml. The solution is to add the activity you are trying to launch, to your manifest. More info on how to do this here

Community
  • 1
  • 1
IAmGroot
  • 13,760
  • 18
  • 84
  • 154