[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
}
}
반응형
'교내활동 > Programming GURU2' 카테고리의 다른 글
GURU2 Android 해커톤 후기 (3) | 2023.02.02 |
---|---|
[Android/Kotlin] 버튼누르면 뜨는 Dialog 만들기 (0) | 2023.01.29 |
[Android/Kotlin] 자동으로 넘어가는 배너 만들기 (0) | 2023.01.29 |
Android Kotlin Fragment (0) | 2023.01.17 |
Android Kotlin Service (0) | 2023.01.17 |