无法从SQLite检查有效登录

时间:2013-12-02 05:39:26

标签: java android sqlite

我正在尝试从Android上的SQLite检查有效的用户名,但我收到此错误:

12-02 00:35:41.885: E/AndroidRuntime(9477): FATAL EXCEPTION: main
12-02 00:35:41.885: E/AndroidRuntime(9477): Process: com.example.easycontacts, PID: 9477
12-02 00:35:41.885: E/AndroidRuntime(9477): java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference
12-02 00:35:41.885: E/AndroidRuntime(9477):     at com.example.easycontacts.DatabaseConnector.checkLogin(DatabaseConnector.java:50)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at com.example.easycontacts.MainActivity$1.onClick(MainActivity.java:48)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.view.View.performClick(View.java:4424)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.view.View$PerformClick.run(View.java:18383)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.os.Handler.handleCallback(Handler.java:733)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.os.Looper.loop(Looper.java:137)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at android.app.ActivityThread.main(ActivityThread.java:5031)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at java.lang.reflect.Method.invoke(Native Method)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
12-02 00:35:41.885: E/AndroidRuntime(9477):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

这是我的MainActivity文件:

public class MainActivity extends Activity {

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

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

    public void login() {
        final Context context = this;
        EditText username = (EditText) findViewById(R.id.loginUsername);
        EditText password = (EditText) findViewById(R.id.loginPassword);
        Button loginButton = (Button) findViewById(R.id.loginButton);
        final String strUsername = username.getText().toString();
        final String strPassword = password.getText().toString();

        loginButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                DatabaseConnector db = new DatabaseConnector(context);
                // if (db.getSingleEntry(strUsername, strPassword)) {
                // Toast.makeText(getApplicationContext(), "Success!",
                // Toast.LENGTH_LONG).show();
                // }
                String storedPassword = db.checkLogin(strUsername);
                Log.d("",storedPassword);
                if (storedPassword.equalsIgnoreCase(strPassword)) {
                    Toast.makeText(getApplicationContext(), "Success!",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Error!",
                            Toast.LENGTH_LONG).show();
                }

            }

        });
    }

    public void signUp() {
        final Context context = this;
        Button signUpButton = (Button) findViewById(R.id.signupButton);
        signUpButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, Signup.class);
                startActivity(intent);

            }
        });
    }

}

DatabaseConnector

public class DatabaseConnector {
    private static final String DATABASE_NAME = "Login";
    private SQLiteDatabase database;
    private DatabaseOpenHelper databaseOpenHelper;

    public DatabaseConnector(Context context) {
        databaseOpenHelper = new DatabaseOpenHelper(context, DATABASE_NAME,
                null, 3);

    }

    public void open() throws SQLException {
        database = databaseOpenHelper.getWritableDatabase();
    }

    public void close() throws SQLException {
        database.close();
    }

    public void registerUser(String username, String password) {
        ContentValues newUser = new ContentValues();
        newUser.put("username", username);
        newUser.put("password", password);
        try {
            open();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        database.insert("users", null, newUser);
        try {
            close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public String checkLogin(String username) {
        Cursor cursor = database.query("users", null, "username=" + username,
                null, 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;

    }
}

DatabaseOpenHelper

public class DatabaseOpenHelper extends SQLiteOpenHelper {

    public DatabaseOpenHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public void onCreate(SQLiteDatabase db) {
        String createQuery = "CREATE TABLE users"
                + "(_id integer primary key autoincrement,"
                + "username TEXT, password TEXT);";
        db.execSQL(createQuery);
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub

    }
}

我可能做错了什么?我很确定,我在DatabaseConnector文件中的某个地方做错了。

还有一件事,我可以完美地插入数据库。

3 个答案:

答案 0 :(得分:1)

您正尝试从表中访问password字段,并且在您的查询中,您甚至没有请求该列,这就是您收到错误的原因。

尝试使用rawQuery获取结果,如下所示:

Cursor cursor  = db.rawQuery("SELECT * FROM users WHERE TRIM(username) = '"+username.trim()+"'", null);

   if (cursor != null && cursor.getCount() > 0)
  {
     //  to get data
     cursor.moveToFirst();
    while(!cursor.isAfterLast())
     {
       //  do get data from cursor
       String password = cursor.getString(cursor.getColumnIndex("password"));
    }

    return password;
}

答案 1 :(得分:1)

用以下

替换checkLogin()方法
public String checkLogin(String username)
{
    Cursor cursor = database.query("users", null,  "username"+ "='" + username.trim() + "'",
                null, null, null, null);

    if(cursor == null || cursor.getCount() == 0) return "";
    cursor.moveToFirst();
    String password =  cursor.getString(cursor.getColumnIndex("password"));  
    return password;
}

用以下

替换您的loginButton方法
loginButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            DatabaseConnector db = new DatabaseConnector(context);
            db.open();
            String storedPassword = db.checkLogin(strUsername);
            db.close();

            if (storedPassword.equalsIgnoreCase(strPassword)) {
                Toast.makeText(getApplicationContext(), "Success!",
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getApplicationContext(), "Error!",
                        Toast.LENGTH_LONG).show();
            }

        }

    });

希望它会对你有所帮助。

答案 2 :(得分:0)

当您致电支票登录时。这是代码

 DatabaseConnector db = new DatabaseConnector(context);
                // if (db.getSingleEntry(strUsername, strPassword)) {
                // Toast.makeText(getApplicationContext(), "Success!",
                // Toast.LENGTH_LONG).show();
                // }
                String storedPassword = db.checkLogin(strUsername);

但问题是,当时是您的DatabaseConnector类,您的

  private SQLiteDatabase database;

未实例化。

所以在chekLogin()中,数据库对象为空。

试试这个。

 DatabaseConnector db = new DatabaseConnector(context);
                    // if (db.getSingleEntry(strUsername, strPassword)) {
                    // Toast.makeText(getApplicationContext(), "Success!",
                    // Toast.LENGTH_LONG).show();
                    // }
                    db.open();
                    String storedPassword = db.checkLogin(strUsername);
                    db.close();

我希望这会奏效。