2016-12-05 24 views
1

public class confirmDeletePopUp從名爲removeUser的另一個類的EditText中獲取併發送電子郵件。然後它通過getDetailsAsync類發送該電子郵件並調用DBHelper getDeleteDetails類來獲取所需的信息。如何通過Android中的asynctask從Hashmap獲取輸出?

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 


import java.util.HashMap; 

public class confirmDeletePopUp extends AppCompatActivity { 

    private TextView tvAccountLevel, tvFirstName, tvLastName, tvEmail, tvID; 
    String removeEmail; 

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

     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 

     int width = dm.widthPixels; 
     int height = dm.heightPixels; 

     getWindow().setLayout((int) (width * .8), (int) (height * .8)); 

     tvID = (TextView) findViewById(R.id.tvID); 
     tvAccountLevel = (TextView) findViewById(R.id.tvAccountLevel); 
     tvFirstName = (TextView) findViewById(R.id.tvFirstName); 
     tvLastName = (TextView) findViewById(R.id.tvLastName); 
     tvEmail = (TextView) findViewById(R.id.tvEmail); 
     final Button confirmDelete = (Button) findViewById(R.id.tvConfirmDelete); 

     // Send request 
     getDetailsAsync detailsAsync = new getDetailsAsync(); 
     detailsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 


     confirmDelete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (tvID.getText().toString().equals("") || tvEmail.getText().toString().equals("")){ 
        Toast.makeText(confirmDeletePopUp.this, "ID & Email are empty", Toast.LENGTH_SHORT).show(); 
       }else { 
        confirmDeleteAsync cda = new confirmDeleteAsync(); 
        cda.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
       } 
      } 
     }); 

    } 

    // get email to remove from remove user class 
    public void fromRemoveUser(String emailToRemove){ 
     removeEmail = emailToRemove; 
    } 

    private class getDetailsAsync extends AsyncTask<Void, Void, Void>{ 

     HashMap<String, String> details = new HashMap<>(); 

     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      DBHelper db = new DBHelper(); 
      details = db.getDeleteDetails(removeEmail); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      setValues(details.get("id"), details.get("accountLevel"), 
        details.get("firstName"), details.get("lastName"), 
        details.get("email")); 
     } 
    } 

    private void setValues (String id, String al, String fn, String ln, String em){ 
     tvID.setText(id); 
     tvAccountLevel.setText(al); 
     tvFirstName.setText(fn); 
     tvLastName.setText(ln); 
     tvEmail.setText(em); 
    } 

我的問題是,我不能告訴如果DBHelper類實際上是從數據庫檢索信息。這是DBHelper的代碼。它應該在confirmDeletePopUp類中將Hashmap返回到Hashmap變量。然後將TextViews設置爲找到的數據。但它從不返回任何數據。相反,我只是在字段中提示gui彈出窗口的活動。

// get details for deleting user 
    public HashMap<String, String> getDeleteDetails (String email){ 

     HashMap<String, String> detail = new HashMap<>(); 

     String getDeleteDetails = "SELECT FROM * accounts WHERE email = '" + email + "'"; 

     try { 
      Statement st = conn.createStatement(); 
      ResultSet rs = st.executeQuery(getDeleteDetails); 

      while(rs.next()){ 
       detail.put("id", rs.getString(1)); 
       detail.put("accountLevel", rs.getString(2)); 
       detail.put("firstName", rs.getString(3)); 
       detail.put("lastName", rs.getString(4)); 
       detail.put("email", rs.getString(7)); 
      } 

     } catch (SQLException e){ 
      e.getStackTrace(); 
     } 

     return detail; 
    } 
+0

getDeleteDetails中的查詢看起來像可能存在SQL注入漏洞 - 如果可以,請使用參數綁定。 – halfer

回答

0

只要改變類型的AsyncTask返回HashMap這樣的:

private class getDetailsAsync extends AsyncTask<Void, Void, HashMap<String,String>> { 



     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected HashMap<String, String> doInBackground(Void... voids) { 
      DBHelper db = new DBHelper(); 
      HashMap<String, String> details = new HashMap<>(); 
      details = db.getDeleteDetails(removeEmail); 
      return details; 
     } 

     @Override 
     protected void onPostExecute(HashMap<String, String> hashMap) { 
      setValues(details.get("id"), details.get("accountLevel"), 
        details.get("firstName"), details.get("lastName"), 
        details.get("email")); 
     } 
    } 

您將得到返回的細節HashMaponPostExecute方法。

+0

我試過了,沒有運氣。但我注意到removeUser類的電子郵件沒有被傳遞給confirmDeletePopUp。但它只是一個簡單的方法。不知道爲什麼 – vsb

+0

你能顯示你的服務器返回的輸出嗎? –

+1

想通了。問題出在查詢中。星號在錯誤的地方。這個小問題是無情的。大聲笑謝謝你的幫助。我做了你所說的。 – vsb

相關問題