2013-02-09 75 views
0

我遇到了驗證我的Android應用程序登錄的問題。我有2個字段,要求用戶輸入電子郵件和密碼,如果兩者都存在於數據庫中,那麼如果出現不正確的錯誤,它們將被帶到主屏幕(成功登錄)。我已經嘗試了一切,但仍然無法正常工作!請幫助我在下面發佈了我的代碼。無法驗證使用SQLite db登錄Android應用程序

package com.example.finalproject; 



import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class LoginActivity extends Activity implements OnClickListener{ 

    EditText mEmailAdd; 
    EditText mPassword; 
    private SQLiteAdapter mydb = null; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_activity); 
     //addListenerOnButton(); 
    } 

    public void onCreateMainscreen(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screenmain_activity); 

     Button mNewUser = (Button)findViewById(R.id.btnLogMain); 
      mNewUser.setOnClickListener(this); 
    } 








    public void onClick(View v) { 

     switch(v.getId()){ 

     case R.id.btnLogMain: 
      mEmailAdd = (EditText)findViewById(R.id.email); 
      mPassword = (EditText)findViewById(R.id.password); 

      String uname = mEmailAdd.getText().toString(); 
      String pass = mPassword.getText().toString(); 

      if(uname.equals("") || uname == null){ 
       Toast.makeText(getApplicationContext(), "email Empty", Toast.LENGTH_SHORT).show(); 
      }else if(pass.equals("") || pass == null){ 
       Toast.makeText(getApplicationContext(), "Password Empty", Toast.LENGTH_SHORT).show(); 
      }else{ 
       boolean validLogin = validateLogin(uname, pass, LoginActivity.this); 
       if(validLogin){ 
        System.out.println("In Valid"); 
        Intent i = new Intent(LoginActivity.this, MainMenuActivity.class); 
        startActivity(i); 
        finish(); 
       } 
      } 
      break; 


     } 
    } 

     // @SuppressWarnings("deprecation") 

    public boolean validateLogin(String uemail, String pass, Context context) { 

     mydb = new SQLiteAdapter(this); 
     SQLiteAdapter db = mydb.openToWrite(); 
     //SELECT 
     String[] columns = {"_id"}; 

     //WHERE clause 
     String selection = "email=? AND password=?"; 

     //WHERE clause arguments 
     String[] selectionArgs = {uemail,pass}; 

     Cursor cursor = null; 
     try{ 
     //SELECT _id FROM login WHERE email=uemail AND password=pass 
     cursor = db.query(SQLiteAdapter.MYDATABASE_TABLE, columns, selection, selectionArgs, null, null, null); 

     // startManagingCursor(cursor); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     int numberOfRows = cursor.getCount(); 

     if(numberOfRows <= 0){ 

      Toast.makeText(getApplicationContext(), "Failed..\nTry Again", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 


     return true; 
    } 

    public void onDestroy(){ 
     super.onDestroy(); 
     mydb.close(); 
    } 


} 

數據庫類

package com.example.finalproject; 

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

public class SQLiteAdapter { 

public static final String MYDATABASE_NAME = "MY_PROJECT_DATABASE"; 
public static final String MYDATABASE_TABLE = "MY_USERS_TABLE"; 
public static final int MYDATABASE_VERSION = 1; 
public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_EMAIL = "email"; 
public static final String KEY_PASSWORD = "password"; 

//create table MY_DATABASE (ID integer primary key, Content text not null); 
private static final String SCRIPT_CREATE_DATABASE = 
    "create table " + MYDATABASE_TABLE + " (" 
    + KEY_ID + " integer primary key autoincrement, " 
    + KEY_NAME + " text not null, " 
    + KEY_EMAIL + " text not null, " 
    + KEY_PASSWORD + " text not null);"; 

private SQLiteHelper sqLiteHelper; 
private SQLiteDatabase sqLiteDatabase; 

private Context context; 

public SQLiteAdapter(Context c){ 
    context = c; 
} 

public SQLiteAdapter openToRead() throws android.database.SQLException { 
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); 
    sqLiteDatabase = sqLiteHelper.getReadableDatabase(); 
    return this; 
} 

public SQLiteAdapter openToWrite() throws android.database.SQLException { 
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); 
    sqLiteDatabase = sqLiteHelper.getWritableDatabase(); 
    return this; 
} 

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

public long insert(String name, String email, String password){ 

    ContentValues contentValues = new ContentValues(); 
    contentValues.put(KEY_NAME, name); 
    contentValues.put(KEY_EMAIL, email); 
    contentValues.put(KEY_PASSWORD, password); 
    return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues); 
} 

public int deleteAll(){ 
    return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null); 
} 

public Cursor queueAll(){ 
    String[] columns = new String[]{KEY_ID, KEY_NAME, KEY_EMAIL,KEY_PASSWORD}; 
    Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns, 
    null, null, null, null, null); 

    return cursor; 
} 

public class SQLiteHelper extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(SCRIPT_CREATE_DATABASE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    } 
} 
} 
+0

你有例外嗎? – duffy356 2013-02-09 21:33:33

+0

不,我什麼也沒得到,應用程序不會在模擬器中運行。我認爲這可能與在validateLogin()中的以下代碼有關:mydb = new SQLiteAdapter(this); SQLiteAdapter db = mydb.openToWrite(); – user1877082 2013-02-09 22:06:06

回答

0

不是你的錯誤,但改變

if(uname.equals("") || uname == null){ // throws nullpointerexception if uname == null

if(uname == null || uname.length() == 0){ // throws no exception and also checks the " "

+0

在Android中,更簡單的檢查是TextUtils.isEmpty(str)。檢查字符串是空還是空。 – Brandon 2013-02-09 22:47:40

0

不知道這是否僅僅是複製粘貼錯誤,但所提供的代碼不僅不能編譯,而且也不會爲登錄按鈕設置單擊監聽器。以下是我修改的內容,以便它能夠編譯和查詢數據庫。

SQLiteAdapter

public SQLiteDatabase openToWrite() throws android.database.SQLException { 
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, 
      MYDATABASE_VERSION); 
    sqLiteDatabase = sqLiteHelper.getWritableDatabase(); 
    return sqLiteDatabase; 
} 

LoginActivity

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login_activity); 
    //addListenerOnButton(); 

    Button mNewUser = (Button)findViewById(R.id.btnLogMain); 
    mNewUser.setOnClickListener(this); 
} 

public void onCreateMainscreen(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screenmain_activity); 

    Button mNewUser = (Button)findViewById(R.id.btnLogMain); 
    mNewUser.setOnClickListener(this); 
} 
public boolean validateLogin(String uemail, String pass, Context context) { 

    mydb = new SQLiteAdapter(this); 
    SQLiteDatabase db = mydb.openToWrite(); 
    //SELECT 
    String[] columns = {"_id"}; 

    //WHERE clause 
    String selection = "email=? AND password=?"; 

    //WHERE clause arguments 
    String[] selectionArgs = {uemail,pass}; 

    Cursor cursor = null; 
    try{ 
    //SELECT _id FROM login WHERE email=uemail AND password=pass 
    cursor = db.query(SQLiteAdapter.MYDATABASE_TABLE, columns, selection, selectionArgs, null, null, null); 

    // startManagingCursor(cursor); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    int numberOfRows = cursor.getCount(); 

    if(numberOfRows <= 0){ 

     Toast.makeText(getApplicationContext(), "Failed..\nTry Again", Toast.LENGTH_SHORT).show(); 
     return false; 
    } 


    return true; 
} 

還要注意,這個代碼將永遠不會將任何物品到數據庫中,無論是。我認爲這將在別處完成。此外,還有許多命名慣例和一般良好做法在這裏被打破。

的幾個問題:

  • 決不做在主線程上的數據庫工作。
  • 帶'm'前綴的變量表示它們是該類的成員變量。
  • 確保在適當時使用@Override表示法。
+0

謝謝你,我已經試過這個&仍然在以下2行代碼錯誤mydb = new SQLiteAdapter(this); SQLiteAdapter db = mydb.openToWrite(); – user1877082 2013-02-10 01:30:33

+0

哎呀,沒有更新validateLogin()方法。一旦更改SQLiteAdapter中的openToWrite()方法,您也必須稍微更改該代碼,基本上要反映返回值現在是SQLiteDatabase對象。我更新了包含這個的答案。 – Brandon 2013-02-10 03:51:55

+0

謝謝你的幫助布蘭登,但我仍然有問題,現在當我點擊登錄按鈕的應用程序停止工作,我已經檢查了代碼,並且似乎無法找到任何錯誤! – user1877082 2013-02-10 12:41:20

相關問題