본문 바로가기

책 요약하기/코틀린을 활용한 안드로이드 프로그래밍

#12. 데이터 저장과 관리 2021-02-21

- 요약 -

1. SQLite는 관계형 DBMS의 일종입니다.

2. 데이터베이스 관련 용어는 다음과 같습니다.

  • 데이터: 하나하나의 단편적인 정보
  • 테이블: 데이터가 표 형태로 표현된 것
  • 데이터베이스(DB): 테이블이 저장되는 저장소
  • DBMS: 데이터베이스를 관리하는 시스템 또는 소프트웨어
  • 열: 각 테이블은 1개 이상의 열로 구성됨
  • 열 이름: 각 열을 구분하는 이름
  • 데이터 형식: 열의 데이터 형식
  • 행: 실제 데이터
  • SQL: 사용자와 DBMS가 소통하기 위한 언어

3. 명령 프롬프트에서 SQLite에 접속하려면 adb.exe파일을 이용합니다.

4. 데이터베이스를 운영하기 위한 SQL문의 형식은 다음과 같습니다.

  • 테이블 생성: CREATE TABLE 테이블이름(열이름1 데이터형식, 열이름2 데이터형식, ...);
  • 데이터 입력: INSERT INTO 테이블이름 VALUES(값1, 값2, ...);
  • 데이터 수정: UPDATE 테이블이름 SET 변경할 열 = 새값 WHERE 조건;
  • 데이터 삭제: DELETE FROM 테이블이름 WHERE 조건;
  • 데이터 조회: SELECT 열이름1, 열이름2, ... FROM 테이블이름 WHERE 조건;

5. SQLite를 프로그래밍하려면 SQLiteOpenHelper 클래스, SQLiteDatabase 클래스, Cursor 인터페이스를 활용해야 합니다.

6. SQLite GUI 툴에는 DB Browser for SQLite, SQLite Developer, SQLite Manager 등이 있다. SQLite GUI 툴에서는 CSV 파일을 불러올 수 있어 대량의 데이터를 입력할 때 유용하다.

 

- 연습문제 - 

1. 다음은 각각 어떤 용어에 대한 설명인가?'

  1. 열에 숫자형, 문자형, 날짜형 중 어떤 것을 입력할지 지정
  2. 데이터베이스를 관리하는 시스템 또는 소프트웨어
  3. 테이블이 저장되는 저장소

답 : 데이터형식, DBMS, 데이터베이스

 

2. 다음 메소드는 SQLiteOpenHelper, SQLiteDatabase, Cursor 중 어디에 속하는지 구분하시오.

close(), query(), onCreate(), moveToLast(), getReadableDatabase(), rawQuery(), getWritableDatabase(), execSQL(), moveToFirst(), onUpgrade(), moveToNext()

답 : 

SQLiteOpenHelper Class (생성자) DB 생성 
onCreate() 테이블 생성
onUpgrade() 데이블 삭제 후 다시 생성
getReadableDatabase() 읽기 전용 DB 열기, SQLiteDatabase 반환
getWritableDatabase() 읽고 쓰기용 DB 열기, SQLiteDatabase 반환
SQLite Database Class  
close() DB 닫기
query(), rawQuery() Select 실행 후 커서 반환
execSQL() SQL 문(Insert, Delete, Update) 실행
Cursor Class  
moveToLast() 커서의 마지막 행으로 이동
moveToFirst() 커서의 첫 행으로 이동
moveToNext() 현재 커서의 다음 행으로 이동

 

3. SQLite 명령과 그 의미를 바르게 연결하시오

답 :

①. table - ⓔ 현재 데이터베이스의 테이블 목록을 보여준다.

② .schema - ⓑ 테이블의 열 및 데이터 형식 등의 정보를 보여준다.

③ .header on - ⓓ SELECT 문으로 출력할 때 헤더를 보여준다.

④ .mode column - ⓐ SELECT 문으로 출력할 때 칼럼 모드로 출력해준다.

⑤ .exit - ⓒ SQLite를 종료한다.

 

4. 데이터베이스 구축 절차를 차례로 나열하시오.

ⓐ 데이터 입력

ⓑ 데이터베이스 생성

ⓒ 테이블 생성

ⓓ 데이터 조회

답 : ⓑ - ⓒ - ⓐ - ⓓ

 

5. [실습 12-1]을 참조하여 다음 조건에 맞게 테이블을 생성하시오.

  • 데이터베이스 이름은 ex12_5DB로 한다.
  • 테이블 이름은 prodTable로, 열 이름은 num, uName, product, count로 한다.
  • Primary Key를 순번으로 한다.
  • 순번은 Insert 문에서 별도로 입력하지 않고 자동으로 1부터 1씩 증가되어 입력되게 한다.
순번 이름 물품명 수량
1 송강호 운동화 2
2 원빈 노트북 1
3 소지섭 모니터 1
4 봉준호 모니터 5

 

android studio AVD 실행합니다. (Google APIs Target의 AVD로 실행 해야합니다.)
명령 프롬프트를 관리자 권한으로 열고
cd C:\Users\[사용자 이름]\AppData\Local\Android\Sdk\platform-tools
를입력합니다.
adb root
adb shell
cd data/data/[패키지 이름 ex) com.project.myapplication]
mkdir databases
cd databases
sqlite3 ex12_5DB
CREATE TABLE prodTable(num integer primary key autoincrement, uName char(10), product char(10), count Integer);
(primary key = 기본키 지정, autoincrement = 자동으로 값 1씩 증가)
INSERT INTO prodTable (uName, product, count) VALUES(송강호, 운동화, 2);
INSERT INTO prodTable (uName, product, count) VALUES (원빈, 노트북, 1);
INSERT INTO prodTable (uName, product, count) VALUES(소지섭, 모니터, 1);
INSERT INTO prodTable (uName, product, count) VALUES(봉준호, 모니터, 5);

(★ 별도의 num값을 입력하지 않아도 자동으로 증가했습니다 :))

 

6. 8장에서 작성한 [직접 풀어보기 8-1]의 일기장 앱을 내장 메모리가 아닌 SQLite 저장되게 수정하시오. 단, 데이터베이스는 myDB로, 테이블은 myDiary로 한다. 테이블의 열은 다음 표와 같다.

 

[activity_main.xml]

 

[MainActivity.kt]

(★ 전역변수 선언 및 정의 후 myDBHelper 인스턴스를 생성합니다.)

 

(★ 1. 에플리케이션 동작 시 현재 myDiary 테이블에 저장되어 있는 날짜를 색인으로 사용하여 저장된 content를 EditText에 저장합니다. 2. 데이트 피커 초기화는 데이트 피커로 날짜를 옮길 때 마다 상단의 1번과 동일하게 작동합니다. 3. 버튼 클릭 시 수정 SQL로 EditText에 저장된 텍스트를 수정합니다.)

 

(★ 1. 다이어리 date, content 변수를 선언합니다. 2. 데이터베이스를 읽기 전용으로 열고 모든 테이블의 내용을 조회한 후 커서에 대입합니다. 즉 테이블에 입력된 모든 행데이터가 커서 변수에 들어 있는 상태가 되며, 현재는 첫 번째 행을 가리키고 있습니다. 3. diaryContent가 null일 경우(즉, 다이어리에 어떠한 내용도 적혀있지 않은 경우) 다이어리 내용을 null상태로 리턴합니다. 만약 readDiary() 메소드의 파라미터인 date와 커서의 0번째 열(date)가 다를경우(데이터가 입력되지 않은 상태) 비어있는 행데이터를 넣어줍니다.)

 

(★ myDBHelper 클래스는 SQLiteOpenHelper클래스를 상속하며 두번째 파라미터는 새로 생성된 데이터베이스의 파일명을 지정하고 마지막 파라미터는 데이터베이스 버전으로 처음에는 1을 지정한다. onCreate()메소드와 onUpgrade()메소드는 테이블 생성 메소드와 초기화 메소드로 필요 시 호출한다.)

 

(★ 왼쪽 이미지는 최초에 애플리케이션을 실행한 후 25일 까지 비어있는 행이 생성한 상태이며 오른쪽 이미지는 에플리케이션을 실행 한 후에 테이블에 비어있는 '2021_2_21'의 비어있는 행이 추가된 상태입니다.)

 

 

(★ 해당 이미지는 2021_02_25일에 hello!!! 라는 문자열을 작성한 후 버튼을 클릭한 후의 변화입니다.)

 

(★ 21일부터 25일까지 임의의 문자열을 입력한 후 21일의

내용을 수정한 상태입니다. (왼쪽부터 오른쪽))

 

(★ 에플리케이션 종료 후에도 테이블을 로드하여 저장되어 있는 다이어리 내용을 볼 수 있습니다. :))

 

이상 마치겠습니다 :)