2024. 2. 22. 17:18ㆍ개인 프로젝트
최근 SQLiteDataBase를 새롭게 배우게 되어서 전부터 만들어보고 싶었던 회원가입과 로그인 서비스를 구현해봤습니다!
우선 사용자에게 아이디, 비밀번호, 휴대폰 번호, 이름을 입력 받고 idx라는 순서값도 Data Class에 정의를 했습니다!
이후 SQLiteDataBase를 사용하기 위해 SQLiteOpenHelper를 상속 받은 DBHelper 클래스를 만들어 줬습니다!
DBHelper에선 테이블 생성을 해주었습니다!
다음으로 이제 데이터를 insert, select, delete등을 할 수 있게 LoginDAO라는 클래스를 하나 만들어 companionObject안에
각각 정의를 했습니다
class LoginDAO {
companion object {
//selectOne
fun selectLoginOne(context: Context, userId: String): LoginClass? {
// 쿼리 생성
val sql = """select idx, userId, userPw, userName, userNumber
|from LoginTable
|where userId = ?
""".trimMargin()
// ?에 들어갈 값
val args = arrayOf(userId)
// 쿼리 실행
val dbHelper = DBHelper(context)
val cursor = dbHelper.writableDatabase.rawQuery(sql, args)
// 접근
if (cursor.moveToNext()) {
// 순서값을 가져온다
val idx1 = cursor.getColumnIndex("idx")
val idx2 = cursor.getColumnIndex("userId")
val idx3 = cursor.getColumnIndex("userPw")
val idx4 = cursor.getColumnIndex("userName")
val idx5 = cursor.getColumnIndex("userNumber")
// 데이터를 가져온다
val idx = cursor.getInt(idx1)
val userId = cursor.getString(idx2)
val userPw = cursor.getString(idx3)
val userName = cursor.getString(idx4)
val userNumber = cursor.getInt(idx5)
// 객체에 데이터를 담는다
val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)
// 데이터베이스를 닫아준다
cursor.close()
dbHelper.close()
return loginInfo
} else {
// 데이터가 없는 경우
cursor.close()
dbHelper.close()
return null
}
}
fun selectLoginOne1(context: Context, userNumber: Int): LoginClass? {
// 쿼리 생성
val sql = """select idx, userId, userPw, userName, userNumber
|from LoginTable
|where userNumber = ?
""".trimMargin()
// ?에 들어갈 값
val args = arrayOf(userNumber.toString())
// 쿼리 실행
val dbHelper = DBHelper(context)
val cursor = dbHelper.writableDatabase.rawQuery(sql, args)
// 접근
if (cursor.moveToNext()) {
// 순서값을 가져온다
val idx1 = cursor.getColumnIndex("idx")
val idx2 = cursor.getColumnIndex("userId")
val idx3 = cursor.getColumnIndex("userPw")
val idx4 = cursor.getColumnIndex("userName")
val idx5 = cursor.getColumnIndex("userNumber")
// 데이터를 가져온다
val idx = cursor.getInt(idx1)
val userId = cursor.getString(idx2)
val userPw = cursor.getString(idx3)
val userName = cursor.getString(idx4)
val userNumber = cursor.getInt(idx5)
// 객체에 데이터를 담는다
val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)
// 데이터베이스를 닫아준다
cursor.close()
dbHelper.close()
return loginInfo
} else {
// 데이터가 없는 경우
cursor.close()
dbHelper.close()
return null
}
}
//select All
fun selectLoginAll(context: Context) : MutableList<LoginClass>{
var sql = """select idx, userId, userPw, userName, UserNumber
|from LoginTable
|order by idx desc
""".trimMargin()
//쿼리 실행
var dbHelper = DBHelper(context)
var cursor = dbHelper.writableDatabase.rawQuery(sql, null)
//담을 리스트
var loginList = mutableListOf<LoginClass>()
//접근
while (cursor.moveToNext()){
//순서값을 가져온다
var idx1 = cursor.getColumnIndex("idx")
var idx2 = cursor.getColumnIndex("userId")
var idx3 = cursor.getColumnIndex("userPw")
var idx4 = cursor.getColumnIndex("userName")
var idx5 = cursor.getColumnIndex("userNumber")
//데이터를 가져온다
var idx = cursor.getInt(idx1)
var userId = cursor.getString(idx2)
var userPw = cursor.getString(idx3)
var userName = cursor.getString(idx4)
var userNumber = cursor.getInt(idx5)
var loginModel = LoginClass(idx, userId, userPw, userName, userNumber)
loginList.add(loginModel)
}
dbHelper.close()
return loginList
}
//insert
fun insertLogin(context: Context, loginClass: LoginClass){
//쿼리 생성
var sql = """insert into LoginTable
|(userId, userPw, userName, userNumber)
|values(?, ?, ?, ?)
""".trimMargin()
//?에 들어갈 값
var args = arrayOf(loginClass.userId, loginClass.userPw, loginClass.userName, loginClass.userNumber)
//쿼리 실행
var dbHelper = DBHelper(context)
dbHelper.writableDatabase.execSQL(sql, args)
//닫아준다
dbHelper.close()
}
위의 코드를 보면 selectOne 즉 1개의 데이터를 가져오는 함수가 2개인 걸 볼 수 있습니다.
제가 저렇게 구현을 한 이유는
처음에는 userId를 입력 받는 함수만 만들었는데
아이디 찾기를 할 때에 휴대폰 번호를 입력받게 했었어서 하나를 더 만들었습니다
// 접근
if (cursor.moveToNext()) {
// 순서값을 가져온다
val idx1 = cursor.getColumnIndex("idx")
val idx2 = cursor.getColumnIndex("userId")
val idx3 = cursor.getColumnIndex("userPw")
val idx4 = cursor.getColumnIndex("userName")
val idx5 = cursor.getColumnIndex("userNumber")
// 데이터를 가져온다
val idx = cursor.getInt(idx1)
val userId = cursor.getString(idx2)
val userPw = cursor.getString(idx3)
val userName = cursor.getString(idx4)
val userNumber = cursor.getInt(idx5)
// 객체에 데이터를 담는다
val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)
// 데이터베이스를 닫아준다
cursor.close()
dbHelper.close()
return loginInfo
} else {
// 데이터가 없는 경우
cursor.close()
dbHelper.close()
return null
}
}
이렇게 cursor.moveToNext를 if문으로 구현함으로써 null값이 나오더라도 에러가 나지 않게끔 했습니다!
아 물론 데이터를 저장하는데 null값이 들어올 수도 있지 않을까라는 생각을 했었지만
애초에 데이터를 입력받는 회원가입 화면에서 한 개의 항목이라도 입력을 하지 않으면
데이터를 저장할 수 없게끔 조치를 해두었습니다!
이렇게 데이터 베이스를 만들어 두고 회원가입을 진행하였습니다!
이렇게 이름과 전화번호, 아이디, 비밀번호를 입력받고 값을 모두 데이터 베이스에 저장시켰습니다!
여기서 checkPW는 비밀번호를 잘 입력했는지 확인하기 위해 만들었습니다!
이건 아이디 유효성 검사인데 첫 번째로 아이디를 입력받는 칸이 비어있을 경우 DiaLog를 띄워주고 커서를 옮겨주게끔 했습니다!
이후 만약 사용자가 입력한 아이디가 이미 데이터 베이스에 저장이 되어있을 경우 다른 아이디를 입력하게끔 만들었습니다!
이로써 중복되는 아이디를 방지할 수 있었습니다!
이건 비밀번호 입력 유효성 검사인데 아이디와 마찬가지로 비밀번호를 입력받는 칸이 비어있을 경우 DiaLog를 보여주었고
두 번째는 특수문자를 입력하지 않으면 DiaLog를 보이게 하였습니다!
이후 유효성 검사를 모두 마치면 데이터 베이스에 정보를 저장하고 회원가입 Fragment를 제거 해주었습니다!
회원가입 구현
이후 로그인 화면으로 돌아가서 이렇게 코드를 작성했습니다!
여기서 selectOne을 사용하여 사용자가 입력한 아이디와 비밀번호가 데이터 베이스에 존재하는지를 찾아보고
존재하지 않을 경우 DiaLog를 띄웠습니다!
여기선 사용자가 아이디와 비밀번호를 입력하지 않고 로그인 버튼을 누르게 된다면 DIaLog를 띄워주고 커서를
입력하지 않은 칸으로 옮겨줬습니다!
로그인 구현
'개인 프로젝트' 카테고리의 다른 글
안드로이드 Lottie 사용하기! (0) | 2024.03.17 |
---|---|
네이버맵 API를 사용할 때 내가 지정한 마커를 지우고 싶다면?! (2) | 2024.03.09 |
Status Bar에는 지정된 색만 넣을 수 있나?(상태바 색상 변경) (0) | 2024.03.05 |
왕초보 안드로이드 개발(연습) (0) | 2024.01.24 |