2013-05-17 70 views
0

請幫我找到我的代碼中的問題。我試圖檢查用戶是否輸入了有效的電子郵件地址,以及它是否已經存在。如果用戶通過某些格式輸入了無效的電子郵件地址,我已經陷入困境,我已經檢查過電子郵件是否存在,並且我的問題是用戶輸入新的有效電子郵件地址時,我的應用程序崩潰了。這裏是我的代碼:數據庫中的錯誤

else if (!Email.equals("")) 
{ 
    if(Email.equals(storedEmail)) //Check if the email address already exist 
     { 
      Toast.makeText(getApplicationContext(), "Email address already exist.",Toast.LENGTH_LONG).show(); 
     } 


    else if (!matcherObj.matches()) //it will check if the user enter valid email 
     { 
     Toast.makeText(getApplicationContext(), "Invalid email address.",Toast.LENGTH_LONG).show(); 
     txtEmail.setText(""); 
     } 
    else // if the email address is not existing and is valid it will save to the database 
     { 
     db.Register(newPatientInfo(Fname,Mname,Lname,Suffix,Birthday,Homeno,MobileNo,Email,Brgy,Province,CityMun,Zip,CFname,CLname,DClinic,DClinicAdd)); 
     Toast.makeText(getApplicationContext(),"Saved!", Toast.LENGTH_LONG).show(); 
     Clear(); 
     } 

}

這裏是我在我的數據庫處理器的代碼

public String Patient_Emailexist(String p_email)     
{    
    SQLiteDatabase db = this.getReadableDatabase();    
    Cursor c = db.query(TABLE_PATIENT, null, PATIENT_EMAIL + "=?", new String[]{String.valueOf(p_email)},null, null, null);            
    if (c == null)    
     {       
     c.moveToFirst();          
     }     
     c.moveToFirst();    
     String patient_email = c.getString(c.getColumnIndex(PATIENT_EMAIL));    
     return patient_email; 
} 

我的應用程序崩潰時,我輸入應該是保存在一個有效的和新的電子郵件地址數據庫。提前致謝!

錯誤發現

10月5日至17日:27:17.410:E/AndroidRuntime(678):致命異常:主10月5日至17日:27:17.410:E/AndroidRuntime(678):android.database。 CursorIndexOutOfBoundsException:請求索引0,大小爲0 05-17 10:27:17.410:E/AndroidRuntime(678):at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)05-17 10:27:17.410 :E/AndroidRuntime(678):在android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)05-17 10:27:17.410:E/AndroidRuntime(678):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor。 java:50)05-17 10:27:17.410:E/AndroidRuntime(678):at com.example.palsproject.DatabaseHandler.Patient_Emailexist(DatabaseHandler.java:353)05-17 10:27:17.410:E/AndroidRuntime 67 8):at com.example.palsproject.PatientRegistration $ 1.onClick(PatientRegistration.java:95)05-17 10:27:17.410:E/AndroidRuntime(678):at android.view.View.performClick(View.java: 4084)05-17 10:27:17.410:E/AndroidRuntime(678):at android.view.View $ PerformClick.run(View.java:16966)05-17 10:27:17.410:E/AndroidRuntime(678) :at android.os.Handler.handleCallback(Handler.java:615)05-17 10:27:17.410:E/AndroidRuntime(678):at android.os.Handler.dispatchMessage(Handler.java:92)05-17 10:27:17.410:E/AndroidRuntime(678):在android.os.Looper.loop(Looper.java:137)05-17 10:27:17.410:E/AndroidRuntime(678):在android.app.ActivityThread .main(ActivityThread.java:4745)05-17 10:27:17.410:E/AndroidRuntime(678):at java.lang.reflect.Method.invokeNative(Native Method)05-17 10:27:17.410:E/AndroidRuntime(678):在java.lang.reflect.Method.invoke(Method.java:511)05-17 10:27:17.410:E/AndroidRuntime(678):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller .run(ZygoteInit.java:786)05-17 10:27: 17.410:E/AndroidRuntime(678):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)05-17 10:27:17.410:E/AndroidRuntime(678):at dalvik.system.NativeStart 。主要(本地方法)

+1

什麼錯誤信息,你得到什麼? – girasquid

+0

我怎麼知道?對不起,我只是使用eclipse的新功能。在運行應用程序並測試它是否會捕獲錯誤的輸入後,吐司會彈出說我輸入了無效的電子郵件或者電子郵件已存在的問題,但如果我新的和有效的電子郵件添加應用程序崩潰,說我的項目已停止。 – dolphinately

回答

1

的問題在這裏:

Cursor c = db.query(TABLE_PATIENT, null, PATIENT_EMAIL + "=?", new String[]{String.valueOf(p_email)},null, null, null);            
if (c == null)    
{       
    c.moveToFirst();          
}     
c.moveToFirst();    
String patient_email = c.getString(c.getColumnIndex(PATIENT_EMAIL));    

首先,如果c等於空,c.moveToFirst()會崩潰,但是這是一個單獨的問題。

接着,online help for getString()說:當列值是空值或列類型是不是一個字符串類型實現定義的這個方法

結果和是否拋出異常。

正如你所說,記錄不在數據庫中,所以列值將是null。也許你想:

String patient_email = null; 
if (!c.isNull(c.getColumnIndex(PATIENT_EMAIL)) && c.getType (c.getColumnIndex(PATIENT_EMAIL)) == FIELD_TYPE_STRING) 
    patient_email = c.getString(c.getColumnIndex(PATIENT_EMAIL));    
0

你在做什麼是要檢查指針是否爲空,即使它是空之後還是否會因此ececuted這將是空爲此outofbound對GetString的語句。我有「的開頭,這樣是很空」修改代碼

public String Patient_Emailexist(String p_email)     
{   
    String patient_email=""; 
    SQLiteDatabase db = this.getReadableDatabase();    
    Cursor c = db.query(TABLE_PATIENT, null, PATIENT_EMAIL + "=?", new String[]{String.valueOf(p_email)},null, null, null);            
if (c == null)    
    {       
    return patient_email;         
    } 
else     
{ c.moveToFirst();    
    String patient_email = c.getString(c.getColumnIndex(PATIENT_EMAIL)); 
}    
    return patient_email; 
} 

我已經初始化patient_email以「」會被其他人返回的字符串