2017-05-11 9 views
0

基本的なsqliteベースのログイン/サインアップアプリケーションの構築。ログイン時にアプリがクラッシュするAndroidでのSqliteデータベースの問題

どのような考えですか?

DatabaseHelper.java:

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

アプリは現在、ログイン

エラーログを打った後クラッシュされます。 android.sqliteapp E/AndroidRuntime:致命的例外:メイン プロセス:com.example.android.sqliteapp、PID:3471 java.lang.IllegalStateException:アンドロイドのメソッドを実行できませんでした:onClick(ViewCompatViewInflater.java:293) (android.view.View.performClick(View.java:5637)) (android.view.View $ PerformClick.run()は、 View.java:22429) (アンドロイド.os.Handler.handleCallback(Handler.java:751) (android.os.Handler.dispatchMessage(Handler.java:95)) (android.os.Looper.loop(Looper。 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) (android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at andr (元のメソッド) at 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) でで(アクティビティ)。アクティビティjava:4183) android.support.v4.appにあります。FragmentActivity.startActivityForResult(FragmentActivity.java:859) android.app.Activity.startActivity(Activity.java:4522) (android.app.Activity.startActivity(Activity.java:4490) 、com.example.android)にあります。 (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) (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の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

私が見る限り、インデックス2は 'uname'ではありません。'SELECT *'を使うと 'id'も得られます。これは' uname'が3列目にあることを意味します。 – 0xDEADC0DE

+0

エラーはonButtonClick()を呼び出す場所から何かに関するものですか? –

+0

新しい問題が発生した場合は、通常、新しい質問を投稿する方が良いです。それ以外の場合は、質問が変更されたときにすべての回答を間違えるようにします。あなたの新しい問題への私の答えは以下を参照してください。 – Doomsknight

答えて

1

実際には列名を渡してインデックスを取得する必要がありますrは直接指数よりも大きい。

変更

cursor.getString(2); 

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

になどなどなど。これにより、表や問合せがどのような方法で変更された場合でも、より柔軟になります。

また、一致するレコードが1つだけそのユーザー名に返されるようにクエリを変更する必要があります。すべてのレコードではなく、ループして一致するレコードを探します。

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

編集:はあなたの2番目のエラーのためにあなたがActivityNotFoundExceptionを得ています。ログには明らかにhave you declared this activity in your AndroidManifest.xmlと記載されています。 解決策は、起動しようとしているアクティビティをマニフェストに追加することです。More info on how to do this here

+1

私はどのように愚かです! Doomsknightに感謝します。 – Kalid

1

変更しますsearchPass()メソッド:

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 
} 

あなたのunameのインデックスは3との指標であるとして、パスは4

+0

あなたが言ったように、ログインボタンを押した後にアプリがクラッシュするようになりました。これが他の活動の問題に戻ることはありますか? – Kalid

+0

エラーは何ですか?投稿ログ –

+1

@Doomsknightが提案した私の編集回答を確認してください –

関連する問題