공용 클래스 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 클래스가 실제로 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;
}
'getDeleteDetails'의 쿼리는 SQL 삽입 취약점이있는 것 같습니다. 가능한 경우 매개 변수 바인딩을 사용하십시오. – halfer