QR코드를 이용한 스마트 출석 앱을 만들다가 (과제)

 

로그인 기능과 회원가입 기능에 대한 것을 포함하게 되어 끄적여봅니다.

우선 로그인 화면과 회원가입 화면입니다.

 

로그인 화면에서 username과 password는 데이터베이스에 저장되어 있으며 입력 문자가 너무 짧은 경우 토스트 메시지로 사용자에게 알려줍니다.

 

회원가입 화면에서도, username과 password가 너무 짧다면 거절당하고 password와 confirm이 다를 경우에도 가입이 되지 않습니다.

 

코드

MainActivity.java

 

package com.example.smartattendance;

import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity {

Button button;

SQLiteDatabase newDB;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (newDB == null) {
String dbName = "new";
openDatabase(dbName);
} else {
Toast.makeText(this, "test", Toast.LENGTH_LONG).show();
}

button = (Button) findViewById(R.id.main_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivityForResult(intent, 101);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 101 && resultCode == RESULT_OK) {
String userId = data.getStringExtra("userId");

Intent intent = new Intent(getApplicationContext(), SubjectActivity.class);
intent.putExtra("userId", userId);
startActivityForResult(intent, 102);
} else {
button.setText("로그인에 실패했습니다.\n 다시 로그인 해주세요");
}
}

public void openDatabase(String dbName) {
DatabaseHelper helper = new DatabaseHelper(this, dbName, null, 1);
newDB = helper.getWritableDatabase();
}
}

 

// onCreate()에서 데이터베이스가 없다면 새로 만들게 됩니다.

 

LoginActivity.java

 

package com.example.smartattendance;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends AppCompatActivity {

Button loginButton;
Button memberButton;

EditText id;
EditText password;

String userId;

boolean userExist;

SQLiteDatabase newDB;
DatabaseHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

helper = new DatabaseHelper(this, "new", null, 1);


loginButton = (Button) findViewById(R.id.login_button);
memberButton = (Button) findViewById(R.id.member_button);

id = (EditText) findViewById(R.id.id_input);
password = (EditText) findViewById(R.id.password_input);

loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userExist = false;

String isId = id.getText().toString().trim();
String isPass = password.getText().toString().trim();
if (isId.length() > 4 && isPass.length() > 4)
searchData(isId, isPass);
else
Toast.makeText(LoginActivity.this, "입력이 잘못되었습니다.", Toast.LENGTH_SHORT);

if (userExist) {
Intent intent = new Intent();
intent.putExtra("userId", userId);
setResult(Activity.RESULT_OK, intent);
finish();
} else {
Toast.makeText(LoginActivity.this, "아이디 혹은 비밀번호가" +
"없거나 잘못되었습니다.", Toast.LENGTH_SHORT).show();
}
}
});

memberButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MemberActivity.class);
startActivityForResult(intent, 203);
}
});
}

public void searchData(String isId, String isPass) {
newDB = helper.getReadableDatabase();
String sql = ("select userId, password from test");
Cursor cursor = newDB.rawQuery(sql, null);

for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext();
String id = cursor.getString(0);
String password = cursor.getString(1);
if (id.equals(isId) && password.equals(isPass)) {
userId = id;
userExist = true;
break;
}
}
}
}

 

// 데이터베이스는 DatabaseHelper에서 관리합니다.

사용자의 입력을 데이터베이스에 있는 정보와 비교하고 로그인 성공과 실패를 결정합니다.

 

MemberActivity.java

 

package com.example.smartattendance;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.sql.Time;

public class MemberActivity extends AppCompatActivity {

EditText userId;
EditText userPassword;

SQLiteDatabase newDB;
DatabaseHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_member);

helper = new DatabaseHelper(this, "new", null, 1);

userId = (EditText) findViewById(R.id.member_id);
userPassword = (EditText) findViewById(R.id.member_password);

Button joinButton = (Button) findViewById(R.id.join_button);
joinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String id = userId.getText().toString().trim();
String password = userPassword.getText().toString().trim();

if (id.length() < 5 || password.length() < 5) {
Toast.makeText(MemberActivity.this, "아이디 다섯 글자 이상 \n" +
"비밀번호 다섯 글자 이상" +
"\n 입력해주세요.", Toast.LENGTH_LONG).show();
} else {
insertData(id, password);
setResult(Activity.RESULT_OK);
finish();
}
}
});

Button cancelButton = (Button) findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(Activity.RESULT_CANCELED);
finish();
}
});
}

public void insertData(String id, String password) {
newDB = helper.getWritableDatabase();

String sql = ("insert into test(userId, password) values " +
"(" + "'" + id + "'" + "," + "'" + password + "'" + ")");

newDB.execSQL(sql);
}
}

 

// 조건을 만족한다면 아이디와 패스워드를 데이터베이스에 기록합니다. 각 테이블에서 두 데이터는 같은 id를 가집니다.

 

DatabaseHelper.java

 

package com.example.smartattendance;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {

String userTable = "test";
db.execSQL("create table if not exists " + userTable + " ("
+ " _id integer PRIMARY KEY autoincrement, "
+ " userId text, "
+ " password text);");

String userSubjectTable = "test2";
db.execSQL("create table if not exists " + userSubjectTable + " ("
+ " _id integer PRIMARY KEY autoincrement, "
+ " userId text, "
+ " sub text, "
+ " day text, "
+ " start_time text, "
+ " finish_time text, "
+ " FOREIGN KEY (userId) REFERENCES test (userId));");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}

 

마지막으로 DatabaseHelper 클래스입니다. 데이터베이스 생성. 데이터 기록밖에 하지 않기 때문에 간단하고 짧습니다.

 

부스트코스 안드로이드 프로그래밍에서 만들었던 DatabaseHelper에 비하면 십분의 일 수준이네요.

 

기능으로 묵는다면 LoginActivity.java의 searchData() 메소드를 DatabaseHelper로 옮기는 것도 괜찮겠네요.

+ Recent posts