2016-12-05 3 views
1

공용 클래스 confirmDeletePopUpremoveUser이라는 다른 클래스의 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 클래스가 실제로 DB에서 정보를 검색하는지 알 수 없다는 것입니다. 이것은 DBHelper의 코드입니다. Hashmap을 confirmDeletePopUp 클래스의 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

그냥 같이 HashMap을 반환 AsyncTask의 유형을 변경 :

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")); 
     } 
    } 

당신은 onPostExecute 방법으로 반환 된 세부 사항을 HashMap을 얻을 것이다.

+0

나는 시험했다, 어떤 운도. 하지만 removeUser 클래스의 전자 메일이 confirmDeletePopUp에 전달되지 않는 것을 확인했습니다. 그러나 그것의 다만 간단한 방법. 확실하지 않은 이유 – vsb

+0

서버가 반환하는 출력을 표시 할 수 있습니까? –

+1

그것을 알아 냈습니다. 문제가 쿼리에있었습니다. 별표가 틀린 장소에 있었다. 이 작은 문제는 용서하지 못했습니다. 도와 주셔서 감사합니다. 네가 한 말대로했다. – vsb

관련 문제