-2

ユーザー名とパスワードを挿入するsignup.javaを作成した後、(エミュレーターで)ログインするとアプリが突然停止し、(bluestack)のサインアップページに移動します。サインアップ時にデータが実際にデータベースに入力されているかどうかはわかりません。

DBManager.java

package com.example.student_project;

import com.example.student_project.*;

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


public class DBManager  {
    public static final String KEY_ROWID = "_id";
    public static final String KEY_USERNAME = "username";
    public static final String KEY_PASSWORD = "password";


    private static final String DATABASE_NAME= "LOGIN.db";
    private static final int DATABASE_VERSION  = 4;
    private static final String  DATABASE_TABLE = "LOGIN_TABLE";

    private static DbHelper ourHelper;
    private final Context ourContext;
    private static SQLiteDatabase ourDatabase;

    class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + DATABASE_TABLE + " ( " + 
            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT , " +
            KEY_USERNAME + " TEXT NOT NULL , " + 
            KEY_PASSWORD + " TEXT NOT NULL );" 
            );
                }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }

    }


    public DBManager(Context c) {
    ourContext = c;
    }

    public DBManager open() throws SQLException{
        ourHelper = new DbHelper(ourContext);
        try
        {
            ourDatabase = ourHelper.getWritableDatabase();
        }
        catch(SQLException ex)
        {
            ourDatabase = ourHelper.getReadableDatabase();
        }
        return this;
    }

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

    public long createEntry(String username, String password) throws SQLException
    {
        // TODO Auto-generated method stub
        ContentValues cv = new ContentValues();
        cv.put(KEY_USERNAME, username);
        cv.put(KEY_PASSWORD, password);
        return ourDatabase.insert(DATABASE_TABLE, null, cv);

    }

    public static boolean verifyUser(String username , String password) 
    {

        String columns[] = new String[2];
        columns[0] = username;
        columns[1] = password;
        Cursor c= null;
        int count=0;
        try
        {

                // TODO Auto-generated method stub
                c = ourDatabase.query(DATABASE_TABLE, columns,null , null, null, null, null);
                count = c.getCount();

        }
        catch (SQLException e)
        {
            // TODO: handle exception
            e.printStackTrace();
        }
        finally
        {
            c.close();
        }
        if(count>0)
        {
            return true;
        }
        else
        {
            return false;
        }

    }
}

MainActivity.java

package com.example.student_project;

import com.example.student_project.*;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.text.InputFilter.LengthFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener
{
    private Button btn_signup;
    private Button btn_login;
    private EditText et_lusername;
    private EditText et_lpassword;

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

        Log.i("mytag","this is my tag");
        et_lusername = (EditText) findViewById(R.id.et_lusername);
        et_lpassword = (EditText) findViewById(R.id.et_lpassword);
        btn_signup = (Button) findViewById(R.id.btn_signup);
        btn_login = (Button) findViewById(R.id.btn_login);

        btn_login.setOnClickListener(this);
        btn_signup.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    @Override
    public void onClick(View v)
    {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
            case R.id.btn_login :
            {
                String un = et_lusername.getText().toString();
                String pw = et_lusername.getText().toString();

                boolean success = DBManager.verifyUser(un,pw);
                if (success)
                {
                    Intent i = new Intent(MainActivity.this,AdminMenu.class);
                    startActivity(i);   
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "wrong username or password",Toast.LENGTH_LONG);
                }


            }
            case R.id.btn_signup:
            {
                Intent i = new Intent(MainActivity.this,Signup.class);
                startActivity(i);   
            }
        }
    }
    }

Signup.java

package com.example.student_project;


import com.example.student_project.*;

import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Signup extends Activity implements OnClickListener {
private Button btn_add;
private EditText et_username;
private EditText et_password;
private EditText et_confirmpassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signup);

    et_username = (EditText) findViewById(R.id.et_username);
    et_password = (EditText) findViewById(R.id.et_password);
    et_confirmpassword = (EditText) findViewById(R.id.et_confirmpassword);
    btn_add = (Button) findViewById(R.id.btn_add);

    btn_add.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);

    return true;
}

@Override
public void onClick(View v)
{
    // TODO Auto-generated method stub
    switch(v.getId())
    {
    case R.id.btn_add :

        boolean diditwork = true;        
         try 
         {
            String username = et_username.getText().toString();
             String password = et_password.getText().toString();
             String cpassword = et_confirmpassword.getText().toString();

             if(password.equalsIgnoreCase(cpassword))
             {
                 DBManager empty = new DBManager(Signup.this);
                 empty.open();
                 empty.createEntry(username,password);
                 empty.close(); 

                 Intent addintent = new Intent(Signup.this,MainActivity.class);
                    startActivity(addintent);
             }
             else 
             {
                 Toast.makeText(getApplicationContext(), "passwords does not match", Toast.LENGTH_LONG);
             }
         } 
         catch (Exception e)
         {
            diditwork = false;
            Dialog d = new Dialog(this);
            String error = e.toString();
            d.setTitle("dang");
            TextView tv = new TextView(this);
            tv.setText(error);
            d.setContentView(tv);
            d.show();
        }
        /* finally
         {
            if(diditwork)
            {
            Dialog d = new Dialog(this);
            d.setTitle("hech ya");
            TextView tv = new TextView(this);
            tv.setText("success");
            d.setContentView(tv);
            d.show();
            }

        } */


    }
}

}

管理者.java

package com.example.student_project;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class AdminMenu extends Activity
{

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



}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

logcat エラー

    W/ActivityManager(  293): Unbind failed: could not find connection for android.os.BinderProxy@410ce000

I/Choreographer( 1994): Skipped 55 frames!  The application may be doing too much work on its main thread.

D/AndroidRuntime( 1994): Shutting down VM

W/dalvikvm( 1994): threadid=1: thread exiting with uncaught exception (group=0x40a71930)

E/AndroidRuntime( 1994): FATAL EXCEPTION: main

E/AndroidRuntime( 1994): java.lang.NullPointerException

E/AndroidRuntime( 1994):    at com.example.student_project.DBManager.verifyUser(DBManager.java:110)

E/AndroidRuntime( 1994):    at com.example.student_project.MainActivity.onClick(MainActivity.java:61)

E/AndroidRuntime( 1994):    at android.view.View.performClick(View.java:4204)

E/AndroidRuntime( 1994):    at android.view.View$PerformClick.run(View.java:17355)

E/AndroidRuntime( 1994):    at android.os.Handler.handleCallback(Handler.java:725)

E/AndroidRuntime( 1994):    at android.os.Handler.dispatchMessage(Handler.java:92)

E/AndroidRuntime( 1994):    at android.os.Looper.loop(Looper.java:137)

E/AndroidRuntime( 1994):    at android.app.ActivityThread.main(ActivityThread.java:5041)

E/AndroidRuntime( 1994):    at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime( 1994):    at java.lang.reflect.Method.invoke(Method.java:511)

E/AndroidRuntime( 1994):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

E/AndroidRuntime( 1994):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

E/AndroidRuntime( 1994):    at dalvik.system.NativeStart.main(Native Method)

W/ActivityManager(  293):   Force finishing activity com.example.student_project/.MainActivity

W/WindowManager(  293): Failure taking screenshot for (246x410) to layer 21020
4

2 に答える 2

1

DBManager.verifyUser(un,pw);データベースを開く必要があるものを呼び出しています。おそらくourDatabase変数でNullあり、カーソルを取得しようとすると例外が処理され、null カーソルにアクセスしようとすると未処理になります。

おそらく、その前にverifyUser呼び出す必要があるため、静的である必要はありませんDBManager.open

于 2013-08-26T10:39:50.343 に答える
1

これは、あなたCursor cがnullであるためです..そしてNullPointerExceptioncatchブロック内でverifyUser()..をキャッチSQLExceptionしてExceptionいないためです..キャッチ内をすべての例外をキャッチするように変更します..

于 2013-08-26T10:18:18.097 に答える