0

ボタンを使用するフラグメントクラスがあります。ボタンが存在する場合はユーザーにログインするか、テキストユーザーが無効であることを表示する必要があります。私はsqliteデータベースを使用しています。しかし、問題は、ログイン ボタンをクリックすると、アプリケーションがクラッシュしたことです。Fragのアタッチコードはこちら

public class FirstFragment extends Fragment {

LoginDataBaseAdapter loginDataBaseAdapter;
String userName;
EditText testUser;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.firstfragment,container,false);

    // create a instance of SQLite Database
    loginDataBaseAdapter = new LoginDataBaseAdapter(getActivity());
    loginDataBaseAdapter = loginDataBaseAdapter.open();


    //get the reference of the design


   final  testUser = (EditText) view.findViewById(R.id.editTextUserNameToLogin);
    final EditText testPassword = (EditText) view.findViewById(R.id.editTextPasswordToLogin);
    final Button btnLogin = (Button) view.findViewById(R.id.buttonSignIn);
    final Button btnCreate=(Button)view.findViewById(R.id.buttonCreateAccount);

    //set OnClick Listener on login button

    btnLogin.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

             userName=testUser.getText().toString();

              EditText testPassword = (EditText) getActivity().findViewById(R.id.editTextPasswordToLogin);
              String password = testPassword.getText().toString();


            //fetch the password from the database for respective user name

            String storedPassword = loginDataBaseAdapter.getSinlgeEntry(userName);
            Toast.makeText(getActivity(),storedPassword,1).show();

            // check if the Stored password matches with  Password entered by user
            if (password.equals(storedPassword)) {
                Toast.makeText(getActivity(), "Congrats:Login Sucessfull", Toast.LENGTH_LONG).show();

           } else {
             Toast.makeText(getActivity(), "User Name or Password does not match", Toast.LENGTH_LONG).show();
          }




        }
    });
return view;
}

私のDbクラス「LoginDataBaseAdapter」には、ユーザー名を渡した場所からパスワードをチェックする関数が1つあります。ここにコードがあります

 public String getSinlgeEntry(String userName) {
    Cursor cursor = db.query("LOGIN", null, " USERNAME=?", new String[]{userName}, null, null, null);
    if (cursor.getCount() < 1) // UserName Not Exist
    {
        cursor.close();
        return "NOT EXIST";
    }
    cursor.moveToFirst();
    String password = cursor.getString(cursor.getColumnIndex("PASSWORD"));
    cursor.close();
    return password;
}

今、私はどこが欠けているのか分かりません。ログイン ボタンをクリックすると、アプリケーションがクラッシュします。前もって感謝します。

私のlogcat:

   java.lang.NullPointerException
        at com.example.betatestregister.LoginDataBaseAdapter.getSinlgeEntry(LoginDataBaseAdapter.java:68)
        at com.example.betatestregister.FirstFragment$1.onClick(FirstFragment.java:52)
        at android.view.View.performClick(View.java:4204)
        at android.view.View$PerformClick.run(View.java:17355)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

私の LoginDataBaseAdapter クラスコード:

package com.example.betatestregister;

/** * 24/05/13 に Rohan によって作成されました。*/

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

import android.widget.Toast;




public class LoginDataBaseAdapter {
static final String DATABASE_NAME = "login.db";
static final int DATABASE_VERSION = 1;
public static final int NAME_COLUMN = 1;
// TODO: Create public field for each column in your table.
// SQL Statement to create a new database.
static final String DATABASE_CREATE = "create table " + "LOGIN" +
        "( " + "ID" + " integer primary key autoincrement," + "USERNAME  text,PASSWORD 
text); ";
// Variable to hold the database instance
public SQLiteDatabase db;
// Context of the application using the database.
private final Context context;
// Database open/upgrade helper
private DataBaseHelper dbHelper;

public LoginDataBaseAdapter(Context _context) {
    context = _context;
    dbHelper = new DataBaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public LoginDataBaseAdapter open() throws SQLException {

//        db = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    db.close();
}

public SQLiteDatabase getDatabaseInstance() {
    return db;
}

public void insertEntry(String userName, String password) {
    ContentValues newValues = new ContentValues();
    // Assign values for each row.
    newValues.put("USERNAME", userName);
    newValues.put("PASSWORD", password);

    // Insert the row into your table
    db.insert("LOGIN", null, newValues);
    ///Toast.makeText(context, "Reminder Is Successfully Saved", 
Toast.LENGTH_LONG).show();
}

public int deleteEntry(String UserName) {
    //String id=String.valueOf(ID);
    String where = "USERNAME=?";
    int numberOFEntriesDeleted = db.delete("LOGIN", where, new String[]{UserName});
    // Toast.makeText(context, "Number fo Entry Deleted Successfully : 
"+numberOFEntriesDeleted, Toast.LENGTH_LONG).show();
    return numberOFEntriesDeleted;
}

public String getSinlgeEntry(String userName) {
    Cursor cursor = db.query("LOGIN", null, " USERNAME=?", new String[]{userName}, 
null, null, null);
    if (cursor.getCount() < 1) // UserName Not Exist
    {
        cursor.close();
      //  Toast.makeText(context, "Number fo Entry Deleted Successfully : 
"+numberOFEntriesDeleted, Toast.LENGTH_LONG).show();
        return "NOT EXIST";
    }
    cursor.moveToFirst();
    String password = cursor.getString(cursor.getColumnIndex("PASSWORD"));
    cursor.close();
    return password;
}

public void updateEntry(String userName, String password) {
    // Define the updated row content.
    ContentValues updatedValues = new ContentValues();
    // Assign values for each row.
    updatedValues.put("USERNAME", userName);
    updatedValues.put("PASSWORD", password);

    String where = "USERNAME = ?";
    db.update("LOGIN", updatedValues, where, new String[]{userName});
}

}
4

3 に答える 3

1
loginDataBaseAdapter = loginDataBaseAdapter.open(); 

上記のコードを削除します。
使用のみ

loginDataBaseAdapter.open();  

インスタンスを作成した後、loginDataBaseAdapter を変更しています。

于 2013-05-27T08:04:34.133 に答える
1

あなたの場合、nullのカーソルが返されます。まず、null である理由を確認する必要があります。ただし、カーソルがnullのときにアプリがクラッシュするのを防ぐために、次のようなことができます:

    String storedPassword="";
    String checkPassowrd = loginDataBaseAdapter.getSinlgeEntry(userName);

    if(checkPassword!=null){

     storedPassword = checkPassword;

    }

getSingleEntry メソッドを次のように設定することをお勧めします。

    public String getSinlgeEntry(String userName) {
     Cursor cursor = db.query("LOGIN", null, " USERNAME=?", new String[]{userName}, null, null, null);
     if (cursor.getCount() < 1) // UserName Not Exist
          {
            cursor.close();
              return "NOT EXIST";
        }else{
       cursor.moveToFirst();
      String password = cursor.getString(cursor.getColumnIndex("PASSWORD"));
       cursor.close();
       return password;
      }
   }

何が私をいらいらさせているのですか、本当に最初のエントリにカーソルを合わせたいですか? cursor.MoveToNext() はありませんか?

于 2013-05-27T10:08:08.820 に答える