[Android/Kotlin] DB 정보 가져오기

2023. 1. 29. 16:16교내활동/Programming GURU2

반응형

로그인, 회원가입을 팀원이 완성해준 덕분에 수월하게 할 수 있던 부분이였다

이친구는 진짜 천재 맞음 ㅇㅇ

 

전 흔하디 흔한 감자입니다

 

내가 작업했던 것은 다음과 같다.

 

1. 마이페이지 구성 및 액티비티와 다이얼로그 연결하기

2. 마이페이지 상세 기능 구성하기

 

마이페이지는 이렇게 구성을 했는데, 하나의 버튼으로 모든걸 할 수 있긴 하지만, 너무 화면이 비는 것 같아서 일부러 분리를 해두었다.

① DB에서 닉네임을 가져와서 TextView에 띄워줌

② DB에서 레벨을 가져와 TextView에 띄워줌

  • 닉네임 수정 후 바로 변경된 내역이 적용되지 않음

③ 회원정보를 조회할 수 있는 Activity로 넘어감

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import com.example.happypig.DBManager
import com.example.happypig.R


class MemberInfo : AppCompatActivity() {
	
    // 정보를 보여줄 TextView
    lateinit var idTv : TextView
    lateinit var emailTv : TextView
    lateinit var nickTv : TextView
    lateinit var lvTv: TextView
	
    // DB에서 가지고 올 정보들
    lateinit var nick : String
    lateinit var email : String
    var lv : Int = 0

    private val id by lazy { intent.getStringExtra("id") as String }

    @SuppressLint("MissingInflatedId", "Range")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_member_info)
        
		// DB 접근용 코드
        val myHelper = DBManager(this, "guruDB", null, 1)
        var db = myHelper.readableDatabase
		
        // TextView 선언
        idTv = findViewById(R.id.idTv)
        emailTv = findViewById(R.id.emailTv)
        nickTv = findViewById(R.id.nickTv)
        lvTv = findViewById(R.id.lvTv)
		
        // DB에서 필요한 정보들 가져오기
        val cursor = db.rawQuery("SELECT * FROM personnel WHERE id = '" + id + "';",null)
        if (cursor.moveToNext()) {

            email = cursor.getString(cursor.getColumnIndex("email")).toString()
            nick = cursor.getString(cursor.getColumnIndex("nickname")).toString()
            lv = cursor.getString(cursor.getColumnIndex("lv")).toInt()

        }
        cursor.close()
        
		// TextView에 가져온 정보들 띄워주기
        idTv.text = "아이디: $id"
        emailTv.text = "이메일: $email"
        nickTv.text = "닉네임: $nick"
        lvTv.text = "레벨: ${lv}"

        // memberinfo용 toolbar
        val toolbarChangeNick = findViewById<Toolbar>(R.id.toolbarMemberInfo)
        setSupportActionBar(toolbarChangeNick)

    }
}

④ 닉네임을 변경하는 Activity로 넘어감

import android.content.Intent
import android.database.Cursor
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import com.example.happypig.DBManager
import com.example.happypig.R

class ChangeNick : AppCompatActivity() {
	
    // 닉네임 변경을 위해 입력받는 EditText, 입력확인을 받을 Button
    lateinit var changeNick : EditText
    lateinit var acceptBtn : Button
    
    // DB 접근을 위한 선언
    lateinit var cursor : Cursor
    private val id by lazy {
        intent.getStringExtra("id").toString()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_change_nick)
		
        // DB접근용 선언
        val myHelper = DBManager(this, "guruDB", null, 1)
        var db = myHelper.writableDatabase

        // 닉네임 변경
        changeNick = findViewById(R.id.changeNickEt)
        acceptBtn = findViewById(R.id.acceptBtn)

		// 버튼 눌러서 확인을 받음
        acceptBtn.setOnClickListener{
            db.execSQL("UPDATE personnel SET nickname = '" + changeNick.text + "' WHERE id = '" + id + "';")
            db.close()
            Toast.makeText(this, "닉네임이 변경되었습니다", Toast.LENGTH_SHORT).show()
        }


        // Change Nickname용 toolbar
        val toolbarChangeNick = findViewById<Toolbar>(R.id.toolbarChangeNick)
        setSupportActionBar(toolbarChangeNick)

    }
}

⑤ 비밀번호를 변경하는 Activity로 넘어감

  • 총 네가지 조건을 만족해야 비밀번호 변경이 가능함
import android.annotation.SuppressLint
import android.database.Cursor
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import com.example.happypig.DBManager
import com.example.happypig.R
import com.google.android.gms.common.internal.Objects.ToStringHelper
import java.util.regex.Pattern

class ChangePw : AppCompatActivity() {

    lateinit var presentPw : EditText
    lateinit var newPw : EditText
    lateinit var newPwRe : EditText
    lateinit var acceptBtn : Button
    lateinit var rejectPwTv : TextView
    lateinit var notPresentPwTv : TextView
    lateinit var rejectPwReTv : TextView

    lateinit var dbPw : String
    lateinit var cursor : Cursor

    private val id by lazy {
        intent.getStringExtra("id").toString()
    }

    @SuppressLint("MissingInflatedId", "Range")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_change_pw)

        val myHelper = DBManager(this, "guruDB", null, 1)
        var db = myHelper.writableDatabase

        presentPw = findViewById(R.id.presentPw)
        newPw = findViewById(R.id.newPw)
        newPwRe = findViewById(R.id.newPwRe)
        acceptBtn = findViewById(R.id.acceptBtn2)
        rejectPwTv = findViewById(R.id.rejectPwTv)
        rejectPwReTv = findViewById(R.id.rejectPwReTv)
        notPresentPwTv = findViewById(R.id.notPresentPwTv)

        // db에서 비밀번호 가져오기
        cursor = db.rawQuery("SELECT pw FROM personnel WHERE id = '" + id + "';",null)
        if (cursor.moveToNext()) {
            dbPw = cursor.getString(cursor.getColumnIndex("pw")).toString()
        }
        cursor.close()


        // pw 양식을 맞췄는가
        val pwPattern = "^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z[0-9]]{8,16}$"

        val pattern = Pattern.compile(pwPattern)


        // 비밀번호 변경을 위한 조건들
        acceptBtn.setOnClickListener {
            val matcher = pattern.matcher(newPw.text.toString())
            // 첫번째 조건: 현재 비밀번호가 일치하는가? -> 한다
            if(presentPw.text.toString() == dbPw) {
                // 두번째 조건: 새로운 비밀번호 양식이 맞는가? -> 안맞다
                if(!matcher.find()) {
                    rejectPwTv.text = "비밀번호 양식에 맞지 않습니다.(영문+숫자 8~16자)"
                    rejectPwTv.visibility = View.VISIBLE
                    notPresentPwTv.visibility = View.INVISIBLE
                    rejectPwReTv.visibility = View.INVISIBLE

                // 두번째 조건: 새로운 비밀번호 양식이 맞는가? -> 맞다
                } else {
                    // 세번째 조건: 새로운 비번이 현재 비번과 다른가? -> 다르다
                    if(presentPw.text.toString() != newPw.text.toString()){
                        // 네번째 조건: 새로운 비번과 한번 더 작성한 비번이 일치하는가? -> 일치한다
                        if(newPw.text.toString() == newPwRe.text.toString()){
                            rejectPwTv.visibility = View.INVISIBLE
                            notPresentPwTv.visibility = View.INVISIBLE
                            rejectPwReTv.visibility = View.INVISIBLE
                            db.execSQL("UPDATE personnel SET pw = '" + newPw.text.toString() + "' WHERE id = '" + id + "';")
                            db.close()
                            Toast.makeText(this, "비밀번호가 변경되었습니다", Toast.LENGTH_SHORT).show()
                            finish()
                        // 네번째 조건: 새로운 비번과 한번 더 작성한 비번이 일치하는가? -> 일치하지 않는다
                        } else {
                            rejectPwTv.visibility = View.INVISIBLE
                            notPresentPwTv.visibility = View.INVISIBLE
                            rejectPwReTv.visibility = View.VISIBLE
                        }
                    // 세번째 조건: 새로운 비번이 현재 비번과 다른가? -> 다르지 않다
                    } else {
                        rejectPwTv.text = "현재 비밀번호와 새로운 비밀번호가 일치합니다. 비밀번호를 바꾸세요."
                        rejectPwTv.visibility = View.VISIBLE
                        notPresentPwTv.visibility = View.INVISIBLE
                        rejectPwReTv.visibility = View.INVISIBLE
                    }

                }

            // 첫번째 조건: 현재 비밀번호가 일치하는가? -> 안한다
            } else {
                notPresentPwTv.visibility = View.VISIBLE
                rejectPwTv.visibility = View.INVISIBLE
                rejectPwReTv.visibility = View.INVISIBLE
            }

        }

        // Change Pw용 toolbar
        val toolbarChangeNick = findViewById<Toolbar>(R.id.toolbarChangeNick)
        setSupportActionBar(toolbarChangeNick)
    }

}

⑥ 로그아웃 시 로그인 액티비티로 넘어감, Dialog를 이용해 의사를 물어봄

⑦ 회원탈퇴 시 회원정보 모두 삭제 후 로그인 액티비티로 넘어감, Dialog를 이용해 의사를 물어봄

 

<my page fragment 전체 코드>

import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.DialogInterface
import android.content.Intent
import android.database.Cursor
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import com.example.happypig.DBManager
import com.example.happypig.R
import com.example.happypig.home.HomeActivity
import com.example.happypig.login.LoginActivity
import org.w3c.dom.Text


class MyPageFragment : Fragment() {

    // 1. 상단 노출 정보
    lateinit var nickTv : TextView
    lateinit var lvTv: TextView
    lateinit var nick : String
    var lv : Int = 0


    // 2. 내정보
    lateinit var btnMemberInfo : Button
    lateinit var btnChangeNick : Button
    lateinit var btnChangePw : Button
    lateinit var btnLogout : Button
    lateinit var btnDeleteInfo : Button

    // 3. 기타
    lateinit var btnHelp : Button
    lateinit var btnAnnounce : Button

    // 디비 접속 수정
    lateinit var cursor : Cursor
    private var id : String? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // HomeActivity에 전달되어있던 id를 mypage fragment로 가져옴
        arguments?.let {
            id = it.getString("id")
        }


    }

    @SuppressLint("Range")
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
		
        // fragment에서 Activity만 쓸 수 있는 함수들을 쓰기 위한
        val view = inflater.inflate(R.layout.fragment_my_page, container, false)
        val hActivity = activity as HomeActivity
        
        // DB매니저 가져오기
        val myHelper = DBManager(hActivity, "guruDB", null, 1)

        // 상단 노출 정보
        var db = myHelper.readableDatabase
        //개인정보를 담고있는 테이블에 모든 정보를 가지고온 후 
        var cursor = db.rawQuery("SELECT * FROM personnel WHERE id = '" + id + "';",null)
        // 하나하나 살펴보며 nickname column의 데이터와 lv column의 데이터만 가져옴
        if (cursor.moveToNext()) {
            nick = cursor.getString(cursor.getColumnIndex("nickname")).toString()
            lv = cursor.getString(cursor.getColumnIndex("lv")).toInt()
        }
        cursor.close()
        db.close()
		// TextView 정의하기
        nickTv = view.findViewById(R.id.nickTv)
        lvTv = view.findViewById(R.id.lvTv)
		// 정의한 곳에 DB에서 가져온 데이터를 띄워주기
        nickTv.text = "$nick"
        lvTv.text = "Lv.${lv.toString()}"


        // my info button action
        // 버튼 정의
        btnMemberInfo = view.findViewById(R.id.btnMemberInfo)
        btnChangeNick = view.findViewById(R.id.btnChangeNick)
        btnChangePw = view.findViewById(R.id.btnChangePw)
        btnLogout = view.findViewById(R.id.btnLogOut)
        btnDeleteInfo = view.findViewById(R.id.btnDeleteInfo)

        // 회원 정보 확인하기
        btnMemberInfo.setOnClickListener {
        	// 회원정보를 보여줄 액티비티를 가져오고, 이 액티비티에 id 데이터를 넘겨줌
            val intent = Intent(getActivity(), MemberInfo::class.java)
            intent.putExtra("id", id)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            startActivity(intent)

        }

        // 닉네임 변경하기
        btnChangeNick.setOnClickListener {
          	// 닉네임 변경을 위한 액티비티를 가져오고, 이 액티비티에 id를 넘겨줌
            val intent = Intent(view.context, ChangeNick::class.java)
            intent.putExtra("id", id)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            startActivity(intent)


        }

        // 비밀번호 변경하기
        btnChangePw.setOnClickListener {
        	// 비밀번호 변경을 위한 액티비티를 가져오고, 이 액티비티에 id를 넘겨줌
            val intent = Intent(getActivity(), ChangePw::class.java)
            intent.putExtra("id", id)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            startActivity(intent)

        }

        // Dialog 띄우기: log out
        // 로그아웃은 Dialog를 이용함, 로그아웃 시 로그인 페이지로 넘어가도록 함
        btnLogout.setOnClickListener {
            val dialog = AlertDialog.Builder(hActivity)
            dialog.setTitle("로그아웃")
            dialog.setMessage("로그아웃하시겠습니까?")
            dialog.setPositiveButton("예", DialogInterface.OnClickListener{dialog, _ ->
                val intent = Intent(view.context, LoginActivity::class.java)
                intent.putExtra("id", id)
                startActivity(intent)
            })

            dialog.setNegativeButton("아니요", null)
            dialog.show()


        }
        // Dialog 띄우기: 탈퇴
        // 회원 탈퇴는 Dialog를 이용하며, 회원탈퇴 시 빙고판과 개인정보를 모두 삭제
        btnDeleteInfo.setOnClickListener {
            val dialog2 = AlertDialog.Builder(hActivity)
            dialog2.setTitle("회원 탈퇴")
            dialog2.setMessage("회원 탈퇴하시겠습니까?")
            dialog2.setPositiveButton("예", DialogInterface.OnClickListener{dialog, _ ->
                val myHelper = DBManager(hActivity, "guruDB", null, 1)
                var db = myHelper.writableDatabase
                db.execSQL("DELETE FROM bingo1 WHERE id = '" + id + "';")
                db.execSQL("DELETE FROM bingo2 WHERE id = '" + id + "';")
                db.execSQL("DELETE FROM bingo3 WHERE id = '" + id + "';")
                db.execSQL("DELETE FROM personnel WHERE id = '" + id + "';")
                db.close()
                val intent = Intent(view.context, LoginActivity::class.java)
                startActivity(intent)
            })

            dialog2.setNegativeButton("아니요", null)
            dialog2.show()

        }

        // else action
        // 도움말, 공지사항용 버튼 선언
        btnHelp = view.findViewById(R.id.btnHelp)
        btnAnnounce = view.findViewById(R.id.btnAnnounce)

        // 도움말 액티비티 띄우기 -> 앱 사용 설명서
        btnHelp.setOnClickListener {
            val intent = Intent(getActivity(), Help::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            startActivity(intent)
        }
        // 앱 업데이트 등 공지사항을 볼 수 있는 액티비티 띄우기
        btnAnnounce.setOnClickListener {
            val intent = Intent(getActivity(), Announce::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            startActivity(intent)
        }

        return view

    }

}

 

 

반응형