안드로이드&IOS 앱 개발자 양성

안드로이드&IOS 앱 개발자 양성(73일차)

HRuler 2020. 7. 20. 18:29
더보기

** 파일 입출력

** 파일 입출력 실습
1. Android Project 생성
2. 앱 안에서 사용할 텍스트 파일을 추가
3. Activity_main.xml 파일에 화면 디자인
4. 레이아웃에 디자인한 뷰들을 전부 찾아서 변수에 대입 - Activity 파일에 작성
5. 버튼의 이벤트 처리 코드를 onCreate에 추가

** 안드로이드 앱 내에서 생성한 파일을 확인하는 방법

** 파일 입출력 기능

** SQLite
1. 개요
2. 안드로이드에서 사용
3. 자바에서 데이터베이스 연동을 할 때

** SQLite 파일을 직접 제작하거나 확인하려면
1. 실행 가능한 Activity를 추가(SqliteActivity)
2. layout 파일에 삽입, 갱신, 삭제 그리고 전체 데이터를 조회하기 위한 버튼 4개와 출력할 TextView를 1개 생성
3. SQLite 사용을 위한 SQLiteOpenHelper 클래스로부터 상속받는 클래스를 생성
4. SqliteActivity.java 파일에 인스턴스 변수를 선언
5. SqliteActivity.java 파일에 onCreate 메소드에서 변수에 대한 참조를 생성
6. SqliteActivity.java 파일에 버튼 4개를 클릭했을 때 수행할 내용을 작성

** 클래스 상속받았을 때 에러확인

** 파일 입출력

- 안드로이드의 파일 시스템은 리눅스의 것을 그대로 이용한다.

- 자바의 파일 입출력 API들은 대부분 java.io 패키지에 있다.

  File : 파일에 대한 정보와 관련된 클래스\

  바이트 단위 입출력 클래스

    InputStream -> FileInputStream(파일) -> BufferedInputStream(버퍼 사용)

    OutputStream -> FileOutputStream(파일) -> PrintStream(버퍼 사용)

    Serializable : 객체 단위로 입출력하기 위한 인터페이스이고 스트림은 ObjectInputStream, ObjectOutputStream

  문자 단위 입출력 클래스

    Reader -> FileInputStreamReader(파일) -> BufferedReader(버퍼 사용)

    Writer -> FileOutputStreamWriter(파일) -> PrintWriter(버퍼 사용)

  위의 클래스들을 이용해서 파일이나 콘솔에 입출력하기도 하지만 네트워크에서 데이터를 다운로드 받거나 업로드할 때도 사용환다.

- 자바 입출력 라이브러리를 사용하는데 보안 문제때문에 Context(Activity) 클래스에서 파일 입출력 관리 메소드를 제공한다.

  FileOutputStream openFileOutput(String name, int mode)

  FileInputStream openFileInpt(String name)

- 안드로이드에서는 자신의 디렉토리 영역에 있는 것만 접근이 가능하다.

  앱의 데이터 디렉토리는 /data/data/패키지 이름/ files 디렉토리

- 앱이 설치되면 자신의 자원을 가진 번들 디렉토리와 데이터를 읽고 있는 /data/data/패키지이름/file 디렉토리가 생성된다.

- 번들 디렉토리에 존재하는 파일은 읽을 수는 있지만 수정하지는 못한다.

  수정을 하게되면 앱을 다시 배포해서 승인을 받아야 한다.

- mode는 4가지

  MODE_PRVATE : 현재 앱만 사용할 수 있고 수정을 하게되면 이전 내용이 지원지고 처음부터 업데이트 된다.

  MODE_APPEND : 현재 앱만 사용할 수 있고 수정을 하게되면 이전 내용 뒤에 기록이 된다.

  MODE_WORLD_READABLE : 다른 응용프로그램(앱)이 읽을 수 있도록 생성한다. - ContentProvider를 이용한다.

  MODE_WORLD_WRITEABLE : 다른 응용프로그램(앱)이 기록할 수 있도록 생성한다. - ContentProvider를 이용한다.

- 공용 디렉토리 : 모든 앱이 사용할 수 있는 디렉토리이다.

  Environment.DIRECTORY_ALAMS : 알람 디렉토리 - 오디오 디렉토리

  Environment.DIRECTORY_DCIM : 사진 디렉토리

  Environment.DIRECTORY_DOWNLOADS : 다운로드 디렉토리

  Environment.DIRECTORY_MUSIC : 음악 디렉토리

  Environment.DIRECTORY_MOVIES : 영화 디렉토리

  Environment.DIRECTORY_NOTIFICATIONS : 알림으로 사용할 오디오 디렉토리

  Environment.DIRECTORY_PICTURE : 사진 디렉토리

- 다운로드 받은 파일을 저장하기 위해서 공용 디렉토리 경로 생성

  File f = new Filew(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "파일명");

- 번들에 포함된 파일을 읽기

  안드로이드에서 이진 파일을 앱 내에 포함하고자 할 때는 res 디렉토리에 raw라는 디렉토리에 복사

  이 파일의 내용을 읽고자 할 때는 InputStream openRawResource(int id) 메소드를 호출해서 스트림을 만들어서 읽으면 된다.

 

** 파일 입출력 실습

1. Android Project 생성

2. 앱 안에서 사용할 텍스트 파일을 추가

1) res 디렉토리에 raw라는 디렉토리를 생성

2) 파일을 raw 디렉토리에 복사 - creed.txt

3. Activity_main.xml 파일에서 화면 디자인

- Button 4개(리소스에서 읽기, 파일 기록, 기록한 파일 읽기, 삭제)와 문자열을 입력할 EditText 1개를 배치

4. 레이아웃에 디자인한 뷰들을 전부 찾아서 변수에 대입 - Activity 파일에 작성

1) Activity 파일에 뷰들의 참조형 변수를 인스턴스로 선언

2) onCreate 메소드에서 위의 변수에 뷰를 찾아서 대입하는 코드를 작성

5. 버튼의 이벤트 처리 코드를 onCreate에 추가

1) resread 버튼의 이벤트 처리 코드 작성

2) filewrite 버튼의 이벤트 처리 코드 작성

3) fileread 버튼의 이벤트 처리 코드 작성

4) filedelete 버튼의 이벤트 처리 코드를 작성

 

** 안드로이드 앱 내에서 생성한 파일을 확인하는 방법

- [View] - [Tool Windows] - [Device File Explorer]를 실행

- data/data/본인 패키지 이름/files 디렉토리

  앱을 다시 설치하거나 재실행을 해도 기존에 존재하는 파일은 삭제되지 않으므로 Explorer에서 직접 삭제하거나 에뮬레이터 디렉토리를 찾아서 직접 삭제해야 한다.

 

** 파일 입출력 기능

- 간단한 텍스트 데이터를 앱에 저장할 때 사용한다.

  In App purchase(앱 내에서의 아이템 구매)를 구현하는 경우 아이템을 구매하면 서버에 저장하는 것이 당연하지만 실제 아이템을 사용하기 위해서 앱 내에서 그 데이터를 로드하는 경우 서버에서 가져오면 너무 느리기 때문에 파일이나 설정에 아이템 구매할목을 저장해두고 주기적으로 업데이트를 하도록 만들고 실제 아이템은 파일에서 읽어서 설정

 

** SQLite

1. 개요

- Embedded 분야에서 많이 사용되는 관계형 데이터베이스이다.

- 무료이고 Android나 iOS 그리고 WebBrowser, Python 언어에 내장된 데이터베이스

- C언어로 제작되어 있다.

- 안드로이드에서는 자바 기반의 wrapper 클래스가 제공되서 이 Wrapper 클래스를 이용해서 사용한다.

- iOS에서는 Wrapper 클래스가 Objective-C로 제공(3rd Party 라이브러리)되기 대문에 Bridge를 이용해서 Swift로 변환해서 사용한다.

- 안드로이드에서는 data/data/패키지이름/databases 디렉토리에 데이터가 저장된다.

2. 안드로이드에서 사용

1) SQLiteOpenHelper

- SQLite 사용을 위한 도우미 클래스

- 이 클래스를 상속받는 클래스를 만들고 3개의 메소드를 재정의한다.

- 생성자, onCreate, onUpgrade

- 생성자에서는 SQLiteOpenHelper의 생성자를 호출해서 Context와 데이터베이스 파일이름 그리고 표준 커서 사용여부와 버전을 설정한다.

- onCreate에서는 테이블을 만들고 기본 데이터를 삽입하는 작업을 수행한다.

- onUpgrade는 버전이 변경되었을 때 호출되는 메소드인데 이 때는 기존 테이블의 내용을 지우고 다시 생성한다.

2) SQLiteDatabase 클래스

- SQLite에 명령을 전달하고 명령을 실행해서 결과를 가져오는 클래스이다.

- SQLiteOpenHelper 클래스의 getReadableDatabase나 getWritableDatabase 메소드를 이용해서 객체를 생성한다.

- SQL 실행하는 메소드

  execSQL() : 결과 데이터를 반환하지 않는 SQL 실행

  rawQuery() : 쿼리를 실행하고 일치된 결과를 Cursor(Iterator, Enumeration, 빠른 열거와 같은 개념 - 데이터의 목록을 앞에서 부터 순서대로 하나씩 접근하기 위한 포인터) 객체 형태로 반환한다.

  query() : 쿼리를 실행하고 일치된 결과를 Cursor(Iterator, Enumeration, 빠른 열거와 같은 개념 - 데이터의 목록을 앞에서 부터 순서대로 하나씩 접근하기 위한 포인터) 객체 형태로 반환한다.

- ContentValues를 매개변수로 받는 insert, update, delete 메소드가 있다.

  ContentValues는 Key와 Values로 구성되는 일종의 Map이다.

  ORM 형식으로 데이터를 삽입하고 수정하고 삭제할 수 있다.

3. 자바에서 데이터베이스 연동을 할 때

1) 순수한 JDBC 코드(프레임워크 없이 수행 - Connection, Statement(Statement, PreparedStatement, CallableStatement), ResultSet)를 가지고 연동

2) 프레임워크를 이용해서 연동

- SQL Mapper : SQL과 Java 코드로 분리 - Mybatis

- ORM : Class와 Table을 매핑하는 방식 - Hibernate

 

** SQLite 파일을 직접 제작하거나 확인하려면

- DBeaver와 같은 데이터베이스 접속 프로그램을 확인하거나 Firefox나 Chrome에 Plug-In을 이용하면 된다.

 

** SQLite를 이용한 CRUD(Create, Read, Update, Delete)

- 번호, 이름, 나이를 저장하는 테이블을 이용

1. 실행 가능한 Activity를 추가(SqliteActivity)

2. layout 파일에 삽입, 갱신, 삭제 그리고 전체 데이터를 조회하기 위한 버튼 4개와 출력할 TextView를 1개 생성

3. SQLite 사용을 위한 SQLiteOpenHelper 클래스로부터 상속받는 클래스를 생성

4. SqliteActivity.java 파일에 인스턴스 변수를 선언

- View에 대한 변수를 생성

- PersonDBHelper 변수를 생성

5. SqliteActivity.java 파일의 onCreate 메소드에서 변수에 대한 참조를 생성

- 클래스를 직접 만들고 생성자를 호출해서 객체를 생성하는 경우에는 생성자에서 초기화 작업을 하고 객체를 직접 생성하지 않는 경우라면 API에서 권장하는 메소드에서 초기화를 수행한다.

- Android의 Activity의 클래스에서는 onCreate 메소드에서 초기화하는 것을 권장한다.

6. SqliteActivity.java 파일에 버튼 4개를 클릭했을 때 수행할 내용을 작성

 

** 클래스 상속받았을 때 에러확인

- final class 여서 상속받을 수 없을 때

- 모든 Member가 static이어서 생성자를 private으로 만들었을 때

- singleton이나 factory method pattern을 적용하기 위해 생성자를 public으로 만들지 않은 경우

- 상위 클래스에 추상 메소드가 있는 경우

- 매개변수가 없는 생성자(default constructor)가 없는 경우