일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- 프로젝트
- IOS
- 리니어 레이아웃
- SceneDelegate
- 텍스트뷰 자동 스크롤
- 상대 레이아웃
- 안드로이드
- 수명주기
- 데이터베이스
- 제약 레이아웃
- 드로어블
- 레이아웃
- 액션바
- RecyclerView
- 뷰
- 안드로이드 스튜디오
- 아이폰
- 텍스트뷰 스크롤
- 안드로이드_프로그래밍
- 스낵바
- 코틀린
- 프로그래밍
- edwith
- 코드리뷰
- 서비스
- 테이블_레이아웃
- Swift
- textview auto scroll
- 부스트코스
- Today
- Total
듀다의 성장개발로그
[부스트코스] 안드로이드 프로그래밍 22 - 데이터베이스(2) 본문
이번 포스팅에서는 데이터베이스를 활용한 앱을 직접 만들어보도록 하겠습니다.
데이터는 이름(텍스트), 나이(인티저), 연락처(텍스트)의 세 개 칼럼으로 구성하려고 합니다.
데이터베이스 활용의 네 단계를 모두 수행해야 하기 때문에 네 개의 버튼을 넣어 화면을 위와 같이 구성합니다.
데이터 추가하기 단계에서 입력 없이도 데이터를 추가하기 위해, EditText에 이름, 나이, 연락처 정보를 미리 넣어두었습니다.
public void println(String text) {
textView.append(text);
}
파란 화면에는 스크롤뷰를 넣고 그 안에 TextView를 넣습니다. println메소드를 정의해, 내부 함수가 실행될때마다 그 내용을 이 텍스트뷰에서 보여주기 위함입니다.
public class MainActivity extends AppCompatActivity {
EditText editText1;
EditText editText2;
EditText editText3;
EditText editText4;
EditText editText5;
TextView textView;
SQLiteDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 = (EditText) findViewById(R.id.editText);
editText2 = (EditText) findViewById(R.id.editText2);
editText3 = (EditText) findViewById(R.id.editText3);
editText4 = (EditText) findViewById(R.id.editText4);
editText5 = (EditText) findViewById(R.id.editText5);
textView = (TextView) findViewById(R.id.textView);
소스 파일에서는 각 텍스트뷰를 선언하고 findViewById로 찾습니다.
데이터베이스도 선언해줍니다. 안드로이드 앱에서는 주로 SQLite를 사용합니다.
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String databaseName = editText1.getText().toString();
openDatabase(databaseName);
}
});
첫번째로 데이터베이스를 만들거나 오픈하기 위해 첫번째 버튼에 리스너를 설정하고 onClick에 데이터베이스 이름을 EditText로부터 받아오는 코드와 데이터를 오픈하는 openDatabase 메소드를 넣습니다.
public void openDatabase(String databaseName) {
println("openDatabase() 호출됨");
database = openOrCreateDatabase(databaseName, MODE_PRIVATE, null);
if(database != null) {
println("데이터베이스 오픈됨.");
}
}
openDatabase라는 메소드는 이 앱에서 정의한 메소드로 메시지를 표시하고 데이터베이스를 열거나 생성하는 openOrCreateDatabase 메소드를 호출합니다. 데이터베이스의 이름은 인자로 들어온 스트링(databaseName)으로 설정합니다.
두번째 기능을 실행하는 방법도 동일합니다. 두번째 버튼에 리스너를 설정하고 EditText에서 테이블 이름을 받아옵니다. 그리고 기능을 수행할 메소드(createTable)를 정의해 넣어줍니다.
public void createTable(String tableName) {
println("createTable() 호출됨.");
if(database != null) {
String sql = "create table if not exists " + tableName + "(_id integer PRIMARY KEY autoincrement, name text, age integer, mobile text)";
database.execSQL(sql);
println("테이블 생성됨.");
} else {
println("먼저 데이터베이스를 오픈하세요.");
}
}
데이터베이스가 오픈되어 있어야 두번째 단계 '테이블 생성'을 수행할 수 있습니다. 이 앱에서 사용하는 database가 빈 데이터베이스는 아닌지 확인 후 SQL문으로 CREATE를 수행합니다.
if not exists는 같은 이름의 테이블이 존재하지 않을 경우에만 생성하도록 조건을 넣어주는 코드인데요, 같은 이름의 테이블을 또 생성하려고 하면 오류가 나기 때문에 필요합니다.
_id는 내부적으로 생성되는 아이디입니다. 기본 키의 자동 증가를 설정하는 autoincrement 코드도 넣어주었습니다.
그리고 칼럼의 이름과 형식을 지정해줍니다.
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = editText3.getText().toString();
String ageStr = editText4.getText().toString().trim();
String mobile = editText5.getText().toString().trim();
int age = -1;
try {
Integer.parseInt(ageStr);
} catch (Exception e) {}
insertData(name, age, mobile);
}
});
세번째 단계에선 접근해야 할 EditText가 더 많고, Integer 데이터를 삽입해야 하기 때문에 코드가 조금 다릅니다.
EditText에 입력된 문자열을 불러와 String 변수에 저장합니다. 공백에 의해 오류가 발생하는 것을 방지하기 위해 trim()을 넣어주었습니다.
그리고 -1로 초기화된 int형 age 변수에 ageStr의 값을 파싱해서 넣어줍니다.
public void insertData(String name, int age, String mobile) {
println("insertData() 호출됨.");
if (database != null) {
String sql = "insert into customer(name, age, mobile) values(?, ?, ?)";
Object[] params = {name, age, mobile};
database.execSQL(sql, params);
println("데이터 추가함.");
} else {
println("먼저 데이터베이스를 입력하세요.");
}
}
insertData는 위와 같이 정의합니다.
마찬가지로 database가 오픈되어 있어야 실행 가능합니다.
SQL문 INSERT를 사용합니다. INSERT INTO 뒤에 테이블 이름과 괄호 안에 칼럼 이름을 넣습니다.
create, insert, delete등에서 데이터베이스 객체로 SQL문을 사용하는것이 바로 execSQL인데,
execSQL의 두번째 파라미터로 params를 전달하면
SQL문이 실행되기 전에는 params의 데이터를 ?로 대체하게 됩니다.
결과값이 없는 create, insert, delete등에서 주로 execSQL을 사용합니다.
마지막 단계인 데이터 조회 단계에서는 데이터베이스에 담긴 데이터들을 찾아서 조회해야 합니다.
Button button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tableName = editText2.getText().toString();
selectData(tableName);
}
});
네번째 버튼에 리스너를 연결하고 테이블 이름을 전달해 이 소스에 정의된 selectData메소드를 호출합니다.
public void selectData(String tableName) {
println("selectData() 호출됨");
if (database != null) {
String sql = "select name, age, mobile from " + tableName;
Cursor cursor = database.rawQuery(sql, null);
println("조회된 데이터 개수 : " + cursor.getCount());
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext();
String name = cursor.getString(0);
int age = cursor.getInt(1);
String mobile = cursor.getString(2);
println("#" + i + " -> " + name + "," + age + "," + mobile);
}
cursor.close();
}
}
데이터 조회(SELECT)는 결과값이 있기 때문에 rawQuery를 사용합니다.
테이블의 데이터를 하나씩 열어 화면에 표시하는 코드가 들어가 있습니다.
조회하고 난 뒤에 커서를 닫아줍니다.
안드로이드 스튜디오에서 기본적인 SQL문의 사용만으로 네 단계를 모두 만들 수 있었습니다.
'안드로이드 > 부스트코스' 카테고리의 다른 글
[부스트코스] 안드로이드 프로그래밍 - 프로젝트 E 코드 리뷰 (0) | 2020.03.15 |
---|---|
[부스트코스] 안드로이드 프로그래밍 23 - 데이터베이스(3) (0) | 2020.03.13 |
[부스트코스] 안드로이드 프로그래밍 21 - 데이터베이스(1) (0) | 2020.03.12 |
[부스트코스] 안드로이드 프로그래밍 20 - Volley (0) | 2020.03.07 |
[부스트코스] 안드로이드 프로그래밍 - 프로젝트 D 코드 리뷰 (0) | 2020.03.06 |