개인용 복습공간

[Android] 데이터 저장 방법 - 프레퍼런스, 파일 저장 본문

Android

[Android] 데이터 저장 방법 - 프레퍼런스, 파일 저장

taehwanis 2021. 5. 9. 00:00

 

 

 

기본 데이터, 입력 , 설정 정보 저장 혹은 전달한 데이터를

저장, 관리하기 위한 데이터를 다루기 위한 기본을

습득하려고 한다.

 

 

 

 

프레퍼런스

안드로이드에서 제공하는 프레퍼런스(Preference)는 제일 단순한 저장 형태이다. 각 애플리케이션에 고유한 설정값을 지정하고 <키, 값> 의 조합으로 데이터를 저장한다.

SharedPreference인터페이스를 사용하고 getSharedPreference()에 의해 반환된 프레퍼런스 객체를
접근/수정을 제공한다.

 

 

프레퍼런스 예제

레이아웃 화면

프레퍼런스 기능을 확인하기 위한 부분이라 간단한 사용자 입력창 만으로 구성했다.
여기서는 setting 버튼을 눌렀을 때만 사용자가 입력한 정보를 프레퍼런스를 이용하여 저장하도록
구성했다. (Baseline 사용)

 

 

다음은 메인 액티비티이다 (자세한 내용은 주석으로 설명해 두었다)

MainActivity.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.myapplication;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //레이아웃 객체와 연결한 변수 선언
    EditText edit01, edit02;
    Button btn01, btn02;
 
    //프레퍼런스 객체
    SharedPreferences spref;
    SharedPreferences.Editor editor;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //레이아웃과 연결
        edit01 = (EditText)findViewById(R.id.editText01);
        edit02 = (EditText)findViewById(R.id.editText02);
 
        btn01 = (Button)findViewById(R.id.button01);
        btn02 = (Button)findViewById(R.id.button02);
 
        //버튼 리스너 등록
        btn01.setOnClickListener(this);
        btn02.setOnClickListener(this);
 
 
        //getSharedPreference()에 의해 반환된 프레퍼런스 객체를 접근/수정 제공
        spref = getSharedPreferences("gpref", MODE_PRIVATE); //gpref.xml
        //SharedPreference.Editor editor = spref.edit()
        editor = spref.edit();
 
        //<키, 값>
        String temp1 = spref.getString("editText1","1");
        String temp2 = spref.getString("editText2","2");
 
        edit01.setText(temp1);
        edit02.setText(temp2);
    }
 
    @Override
    public void onClick(View v) {
        String txt01, txt02;
        txt01 = edit01.getText().toString();
        txt02 = edit02.getText().toString();
 
        //프레퍼런스 객체를 수정후, commit() 연산으로 배치 처리
        if(v.getId() == R.id.button01){
            editor.putString("editText1",txt01);
            editor.putString("editText2",txt02);
            editor.commit();
        }
        if(v.getId() == R.id.button02){
            finish();
        }
    }
}
cs

 

 


 

 

프레퍼런스 실행화면

첫 실행화면

ㅇ실행화면 첫 번째이다. edit01과 edit02를 각각 temp1, temp2로 텍스트를 설정했으므로 이러한 화면이
나왔다.

 

 

입력 후 버튼 누르기 전

이와 같이 ID/PW를 입력하고 SETTING버튼을 눌러 저장 후 앱을 종료한다.

 

 

종료 후 다시 실행

앱을 껐다가 다시 실행 시 해당 정보를 불러와 사용한다. 이것은 Device File Explorer에서 찾아볼 수 있다. (에뮬레이터가 실행된 상태여야 볼 수 있다)

gpref.xml

 

 


 

 

파일 저장

디바이스나 저장 매체에 직접적으로 파일을 저장하는 방법이다.
데이터 읽기는 Context.openFileInput() 메서드 호출, FileInputStream 오브젝트를 얻어서 처리하고
데이터 쓰기는 Context.openFileOutput() 메서드 호출, FileOutputStream 오브젝트를 얻어서 처리한다.

 

작성된 파일을 패키지에 포함시키는 방법은 Resource 클래스의 openRawResource() 메서드를 호출, 매개변수로 파일명대신 리소스 ID를 지정하여 이용한다.

 

패키지에 포함된 res/raw/파일명의 특징은 수정이 불가능하고 읽기 전용이다.

 

 

파일 저장 예제

레이아웃 화면

메모 기능을 할 수 있도록 자동 저장되는 기능을 확인하기 위함이라 편집할 수 있는 텍스트와 종료 시
사용할 버튼과Guideline 을 이용하여 구성했다.

1
2
3
4
5
6
<androidx.constraintlayout.widget.Guideline
        android:id="@+id/h_gline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.20" />
cs

 

  • 비율로 지정하는 경우 : layout_constraintGuide_percent
  • 시작점을 기준으로 거리를 지정하는 경우 : layout_constraintGuide_begin
  • 끝점을 기준으로 거리를 지정하는 경우 : layout_constraintGuide_End

 

 

메인 엑티비티를 설명하기 전에 액티비티의 생명주기를 이해할 필요가 있다. 애플리케이션의 재시작 시
이전 실행 시 최종 작성한 결과를 보여주고 작성한 내용을 저장하는 파일이 없거나 처음 실행하는 경우에는 기본적으로 지정해서 가지고 있는 파일을 보여준다.

액티비티 생명주기

 

내용 설명은 주석으로 적어두었다.

MainActivity.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.example.myapplication;
//관련 기능 import
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    //저장할 내용이 있을 때 저장할 파일명
    private static final String LOCAL_FILE = "memo_data.txt";
    EditText edit01;
    Button btn01;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btn01 = (Button)findViewById(R.id.button01);
        btn01.setOnClickListener(this);
 
        //입력 스트림 클래스들의 최상위 클래스
        InputStream in;
        //Reader 스트림에 버퍼링 기능을 추가한 입력 스트림 클래스
        BufferedReader reader;
 
        try{
            in = openFileInput(LOCAL_FILE); //InputStream의 인스턴스를 받아오는 부분
 
        }catch (FileNotFoundException e){
            in = getResources().openRawResource(R.raw.raw_data);
        }
 
        edit01 = (EditText)findViewById(R.id.editText01);
 
 
        try {
            reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
            String s;
            while((s=reader.readLine()) != null ){
                edit01.append(s);
                edit01.append("\n");
            }
        } catch (IOException e) {
            Log.e("Local File",e.getMessage());
        }
 
    }
 
    //절전 상태, 재개(resume)되기 전 데이터 저장!
    @Override
    protected void onPause() {
        super.onPause();
 
        edit01 = (EditText)findViewById(R.id.editText01);
        String s= edit01.getText().toString();
        if(s.length() == 0){
            deleteFile(LOCAL_FILE); //삭제
            return;
        }
        try{
            //데이터 스트림의 기본 출력 담당 (모든 출력 스트림 클래스들의 최상위 클래스)
            OutputStream out;
            //OutputStream의 인스턴스를 받아오는 부분
            out = openFileOutput(LOCAL_FILE, MODE_PRIVATE);//MODE_PRIVATE 다른어플에서 접근 불가
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));
            writer.append(s);
            writer.close();
        }catch (IOException e){
            Log.e("Local File",e.getMessage());
        }
    }
 
    @Override
    public void onClick(View v) {
        finish();
    }
}
cs

 

 


 

 

파일 저장 실행화면

첫 실행화면

실행 시 첫 화면이다. 작성한 내용이 없는 경우, 가지고 있는 원본 파일을 보여주고 기존에 사용자가 작성한 내용이 있는 경우에는 저장된 작성 내용을 보여준다.

 

 

내용 작성

editText01에 글을 작성하고 CLOSE 버튼을 누른다.

 

 

종료 후 다시 실행

앱을 껐다가 다시 실행해도 작성된 내용이 있을 경우 작성되어 저장된 내용이 보인다.
이것도 Device File Explorer에서 찾아볼 수 있다.

memo_data.txt

 

Comments