我正在尝试从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文件中的某个地方做错了。
还有一件事,我可以完美地插入数据库。
答案 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();
我希望这会奏效。