2017-05-11 2 views
0

Aufbau einer grundlegenden SQLite basierte Login/Anmeldung App. Die App stürzt nach dem Login ab.Sqlite-Datenbank-Problem mit Android

Irgendwelche Gedanken?

DatabaseHelper.java:

05-11 06: 27: 30,850 3471-3471/com.example

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); 
} 
} 

Die App jetzt Login

Fehlerprotokoll nach der Kollision mit abstürzt. android.sqliteapp E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: com.beispiel.android.sqliteapp, PID: 3471 java.lang.IllegalStateException: konnte Methode für android nicht ausführen: onClick bei android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInFlater.java:293) bei android.view.View.performClick (View.java:5637) bei android.view.View $ PerformClick.run (View.java:22429) bei android.os.Handler.handleCallback (Handler.java:751) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper. Java: 154) bei android.app.ActivityThread.main (ActivityThread.java:6119) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) verursacht durch: java.lang.reflect.InvocationTargetException bei java.lang.reflect.Method.invoke (native Methode) bei android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288) bei android.view.View.performClick (View.java:5637) bei android.view.View $ Perform .run (View.java:22429) bei android.os.Handler.handleCallback (Handler.java:751) bei android.os.Handler.dispatchMessage (Handler.java:95) bei andr oid.os.Looper.loop (Looper.java:154) bei android.app.ActivityThread.main (ActivityThread.java:6119) bei java.lang.reflect.Method.invoke (native Methode) bei com.android .internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) verursacht durch: android.content.ActivityNotFoundException: Kann nicht gefunden werden explizite Aktivitätsklasse {com.beispiel.android.sqliteapp/com.example.android.sqliteapp.Display}; Hast du diese Aktivität in deiner AndroidManifest.xml deklariert? bei android.app.Instrumentation.checkStartActivityResult (Instrumentation.java:1805) bei android.app.Instrumentation.execStartActivity (Instrumentation.java:1523) bei android.app.Activity.startActivityForResult (Activity.java:4225) bei android.support.v4.app.BaseFragmentActivityJB.startActivityForResult (BaseFragmentActivityJB.java:50) bei android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:79) bei android.app.Activity.startActivityForResult (Aktivität. Java: 4183) bei android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:859) bei android.app.Activity.startActivity (Activity.java:4522) bei android.app.Activity.startActivity (Activity.java:4490) bei com.example.android. sqliteapp.MainActivity.onButtonClick (MainActivity.java:36) bei java.lang.reflect.Method.invoke (systemeigene Methode) bei android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInFlater.java:288) bei android.view.View.Click (View.java:5637) bei android.view.View $ PerformClick.run (View.java:22429) bei android.os.Handler.handleCallback (Handler .java: 751) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:154) bei android.app.ActivityThread.main (ActivityThread.java : 6119) bei java.lang.reflect.Method.invoke (Native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) bei 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; 
} 



} 
+2

Soweit ich sehen kann, Index 2 ist nicht "uname".Wenn Sie 'SELECT *' verwenden, erhalten Sie auch die 'id', was bedeutet, dass' uname' in Spalte 3 ist – 0xDEADC0DE

+0

Fehler betrifft etwas anderes, von wo Sie onButtonClick() aufrufen? –

+0

Es ist im Allgemeinen besser, eine neue Frage zu stellen, wenn Sie ein neues Problem haben. Wie Sie sonst alle Antworten falsch machen, da sich die Frage geändert hat. Siehe unten für meine Antwort auf Ihr neues Problem. – Doomsknight

Antwort

1

Sie sollten wirklich den Namen der Spalte übergeben und seinen Index erhalten, rathe r als Index direkt.

Änderung

cursor.getString(2); 

zu

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

Und so weiter so weiter. Dies macht es vielseitiger, sollte die Tabelle oder Abfrage in irgendeiner Weise geändert werden.

Als Nebenbemerkung sollten Sie Ihre Abfrage so ändern, dass nur ein übereinstimmender Datensatz an diesen Benutzernamen zurückgegeben wird. Anstatt alle Datensätze zu durchsuchen, durchlaufen Sie die Suche nach dem passenden Datensatz.

z.B.

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

Edit: für Ihren zweiten Fehler, den Sie bekommen ActivityNotFoundException. In den Protokollen heißt es eindeutig have you declared this activity in your AndroidManifest.xml. Die Lösung besteht darin, die Aktivität, die Sie starten möchten, zu Ihrem Manifest hinzuzufügen.More info on how to do this here

+1

Wie dumm von mir! Es funktioniert jetzt perfekt, danke Doomsknight! – Kalid

1

Ändern Sie searchPass() -Methode als wie unten:

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 
} 

als Index Ihrer uname der 3 und der Index der Pass ist 4

+0

Ich habe getan, wie du gesagt hast, jetzt stürzt die App ab, nachdem sie den Login-Button gedrückt hat. Könnte das zu anderen Aktivitätsproblemen zurückkehren? – Kalid

+0

Was ist der Fehler? Post-Protokolle –

+1

überprüfen Sie meine bearbeitete Antwort wie von @Doomsknight vorgeschlagen –