2017-05-11 2 views
0

기본 sqlite 기반 로그인/앱 만들기. 로그인을 클릭하면 앱이 다운됩니다.Sqlite 데이터베이스 문제 (안드로이드)

의견이 있으십니까?

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

: 27 :

6월 5일에서 11일까지 30.850 3471-3471/com.example. android.sqliteapp E/AndroidRuntime : 치명적인 예외 : 주 프로세스 : com.example.android.sqliteapp, PID : 3471 java.lang.IllegalStateException : android : onClick에 대한 메소드를 실행할 수 없습니다. android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:293) at android.view.View.performClick (View.java:5637) android.view.View $ PerformClick.run (View.java : 22429) android.os.Handler.handleCallback (Handler.java:751) at android.os.Handler.dispatchMessage (Handler.java:95) at android.os.Looper.loop (루퍼. java : 154) android.app.ActivityThread.main (ActivityThread.java:6119) at java.lang.reflect.Method.invoke (기본 메소드) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) 에 의해 발생 : java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke 네이티브 메소드) android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288) at android.view.View.performClick (View.java:5637) 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 andr oid.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6119) at java.lang.reflect.Method.invoke (기본 메소드) 에서 com.android .internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) 에 의해 발생했습니다. android.content.ActivityNotFoundException : 찾을 수 없습니다. 명시 적 활동 클래스 {com.example.android.sqliteapp/com.example.android.sqliteapp.Display}; AndroidManifest.xml에서이 활동을 선언하셨습니까? android.app.Activity.startActivityForResult에서 android.app.Instrumentation.execStartActivity (Instrumentation.java:1523) 에서 android.app.Instrumentation.checkStartActivityResult (Instrumentation.java:1805) (Activity.java:4225) 에서 에서 android.support.v4.app.BaseFragmentActivityJB.startActivityForResult (BaseFragmentActivityJB.java:50) android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:79) android.app.Activity.startActivityForResult (활동. java : 4183) android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:859) android.app.Activity.startActivity (Activity.java:4522) at android.app.Activity.startActivity (Activity.java:4490) at com.example.android. (기본 메소드) android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288) android.view.View.performClick (View.java:5637) android.view.View $ PerformClick.run (View.java:22429) (android.os.Handler.handleCallback (Handler))에 있습니다. .java : 751) 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 (네이티브 메소드) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) at com.android.internal.os. ZygoteInit.main (ZygoteInit.java:776)

MainActivity 자바 :

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

내가 알 수있는 한, 색인 2는 'uname'이 아닙니다.'SELECT *'를 사용하면'id'도 얻습니다. 즉, uname이 3 열에있을 것입니다. – 0xDEADC0DE

+0

오류는 onButtonClick()을 호출 한 곳에서 뭔가 다른 것입니까? –

+0

새로운 문제가있는 경우 일반적으로 새로운 질문을 게시하는 것이 좋습니다. 그렇지 않으면 질문이 변경되면서 모든 대답이 부정확하게됩니다. 당신의 새로운 문제에 대한 나의 답은 아래를보십시오. – Doomsknight

답변

1

실제로 열의 이름을 전달하고 해당 인덱스 인 rathe를 얻어야합니다. r보다는 직접 색인.

변화

cursor.getString(2); 

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

에 등등 등등. 테이블이나 쿼리가 어떤 방식 으로든 변경되면 더 많은 유연성을 갖게됩니다.

일치하는 레코드가 하나만 반환되도록 쿼리를 변경해야합니다. 모든 레코드가 아니라 일치하는 레코드를 찾기 위해 루프를 반복합니다.

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

편집 : 두 번째 오류는 당신이 ActivityNotFoundException을 얻고있다. 로그에는 분명히 have you declared this activity in your AndroidManifest.xml이 기록되어 있습니다. 해결책은 실행하려는 활동을 매니페스트에 추가하는 것입니다.More info on how to do this here

+1

어리석은 나를! Doomsknight 덕분에 완벽하게 작동합니다! – Kalid

1

변경하면 searchPass() 메소드 : 당신의 UNAME의 인덱스로

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 
} 

3 및 인덱스입니다 패스가 4

+0

내가 말했듯이 이제 앱이 로그인 버튼을 클릭 한 후 충돌합니다. 다른 활동 문제로 되돌릴 수 있습니까? – Kalid

+0

무엇이 오류입니까? 게시물 로그 –

+1

@Doomsknight가 제안한대로 내 편집 된 답변을 확인하십시오 –

관련 문제