CHAP 14. 데이터베이스와 환경 설정
데이터 스토리지
데이터를 저장하는 방법 공유 프레퍼런스(Shared Preferences) 내부 저장(Internal Storage) 키-값 쌍(key-value pair)으로 사적이고 기초적인 데이터를 저장한다. 내부 저장(Internal Storage) 사적인 데이터를 장치 메모리에 저장한다. 외부 저장(External Storage) 공유 데이터를 공유 외부 저장소에 저장한다. SQLite 데이터베이스(SQLite Databases) 구조화된 데이터를 사적인 데이터베이스에 저장한다. 네트워크 연결(Network Connection) 데이터를 네트워크 서버를 사용하여서 웹에 저장한다.
공유 프레퍼런스 애플리케이션의 환경 설정 기초적인 자료형을 키-값 쌍으로 저장하고 복원할 수 있는 방법 기초적인 자료형을 키-값 쌍으로 저장하고 복원할 수 있는 방법 저장된 데이터는 사용자 애플리케이션이 종료되더 라도 저장
공유 프레퍼런스를 얻는 방법 getSharedPreferences(name, mode) getPreferences(mode)
프레퍼런스 파일에서 값을 읽거나 쓰는 메소드 getBoolean(String key, boolean defValue) getInt(String key, int defValue) getString(String key, String defValue) putBoolean(String key, boolean value) putInt(String key, int value) putString(String key, String value)
예제: 문자열을 프레퍼런스에 기록하고 읽는다. 문자열을 입력하고 BACK를 누르더라도 문자열이 없 어지지 않는 예제
예제: 사용자 인터페이스 작성 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="이미지 이름" > </TextView> <EditText android:id="@+id/EditText01" android:hint="여기에 이미지 이름을 입력하시오" android:text="" > </EditText> </LinearLayout>
예제: 액티비티 작성 public class PrefTest01Activity extends Activity { public static final String PREFS_NAME = "MyPrefs"; TextView name; EditText value; String imageName; @Override protected void onCreate(Bundle state){ super.onCreate(state); setContentView(R.layout.main); name = (TextView)findViewById(R.id.TextView01); value = (EditText)findViewById(R.id.EditText01); SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); imageName = settings.getString("imageName", ""); value.setText(imageName); } protected void onStop(){ super.onStop(); SharedPreferences.Editor editor = settings.edit(); imageName = value.getText().toString(); editor.putString("imageName", imageName); editor.commit();
실행 결과 Back 키 다시 실행
애플레케이션 환경 설정 예를 들어서 새로운 소식이 도착했을 때, 알림을 받 을 것인지, 받지 않을 것인지를 사용자가 설정
설정 화면 만들기 설정 화면은 Preference 클래스들을 XML 파일에 선 언하여서 만들어진다 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="first_preferencescreen"> <CheckBoxPreference android:key="wifi enabled" android:title="WiFi" /> android:key="second_preferencescreen" android:title="WiFi settings"> android:key="prefer wifi" android:title="Prefer WiFi" /> ... </PreferenceScreen>
예제: 애플리케이션 환경 설정
사용자 인터페이스 만들기 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="check" android:title="진동여부" android:defaultValue="false" android:summary="체크하면 진동설정" /> <RingtonePreference android:key="ringtone" android:title="벨소리선택" android:showDefault="true" android:showSilent="true" android:summary="벨소리를 선택하시오" /> <EditTextPreference android:key="edit" android:title="음량선택" android:defaultValue="20" android:summary="음량을 선택하시오" /> </PreferenceScreen>
코드 작성 package kr.co.company.preftest02; import android.os.Bundle; import android.preference.PreferenceActivity; public class PrefTest02Activity extends PreferenceActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.pref_activity); }
실행 화면
내부 공간에 파일 만들기 애플리케이션은 장치의 내부 저장 공간에 파일을 저 장할 수 있다. 내부 저장 공간에 저장되는 파일은 해당 애플리케이 션만 접근이 가능하다. 사용자가 애플리케이션을 제거하면 이들 파일들도 제거된다.
내부 공간에 파일 만들기: UI 설계 <LinearLayout ... <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_weight="1" <EditText ... android:singleLine="false" /> </LinearLayout> android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button ... android:text="읽기"/> <Button ... android:text="쓰기"/>
내부 공간에 파일 만들기 public class FileTest01Activity extends Activity { String FILENAME = "test.txt"; EditText edit; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit = (EditText) findViewById(R.id.EditText01); Button readButton = (Button) findViewById(R.id.read); readButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { FileInputStream fis = openFileInput(FILENAME); byte[] buffer = new byte[fis.available()]; fis.read(buffer); edit.setText(new String(buffer)); fis.close(); } catch (IOException e) { } });
내부 공간에 파일 만들기 Button writeButton = (Button) findViewById(R.id.write); writeButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(edit.getText().toString().getBytes()); fos.close(); } catch (IOException e) { } });
실행 결과
외부 공간에 파일 만들기 외부 저장 공간은 착탈이 가능한 SD 카드 외부 저장 공간에 저장된 파일들은 누구나 읽을 수 있으며 사용자에 의해서 변경될 수 있다. 데이터를 읽기 전에 외부 미디어가 장착되어 있는지 를 확인
내부 공간과 외부 공간 비교
외부 미디어 장착 여부 검사 String state = Environment.getExternalStorageState(); if(state.equals(Environment.MEDIA_MOUNTED)) // 미디어에 쓰고 읽을 수 있다 else if(state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) // 미디어를 읽을 수 있다 else // 쓰거나 읽을 수 없다
매니페스트 파일
예제: 외부 공간에 파일 만들기 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String state = Environment.getExternalStorageState(); if(state.equals(Environment.MEDIA_MOUNTED)==false){ Toast.makeText(this,"외부 스토리지 실패",Toast.LENGTH_SHORT).show(); } edit = (EditText) findViewById(R.id.EditText01); Button readButton = (Button) findViewById(R.id.read); readButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { File file = new File(getExternalFilesDir(null), FILENAME); try { InputStream is; is = new FileInputStream(file); byte[] buffer = new byte[is.available()]; is.read(buffer); edit.setText(new String(buffer)); is.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); });
실행 결과
안드로이드에서의 데이터베이스 SQLite www.sqlite.org
데이터베이스
SQL
SQL의 예
결과 집합(Result Sets)과 커서(Cursors)
SQLiteOpenHelper 클래스 이용하여 데이터베이스 생성하기 class dbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mycontacts.db"; private static final int DATABASE_VERSION = 2; public dbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE contact ( _id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT, tel TEXT);"); public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS contact"); onCreate(db);
SQLiteOpenHelper 클래스 이용하여 데이터베이스 생성하기 public class DatabaseTest01 extends Activity { dbHelper helper; SQLiteDatabase db; public void onCreate(Bundle savedInstanceState) { ... helper = new dbHelper(this); try { db = helper.getWritableDatabase(); } catch (SQLiteException ex) { db = helper.getReadableDatabase(); } // 이제 필요할 때마다 db를 통하여서 SQL문장을 실행하면 된다. db.execSQL("INSERT INTO contact VALUES (null, '" + name + "', '" + tel + "');");
예제 연락처를 저장하고 검색하는 간단한 애플리케이션 를 작성하여 보자.
사용자 인터베이스 작성 다음과 같은 사용자 인터페이스를 작성한다.
코드 작성
코드 작성
코드 작성
실행 결과
SQLiteOpenHelper없이 데이터베이스 사용하기 db = openOrCreateDatabase(DATABASE_NAME, null); db.execSQL("CREATE TABLE contact ( _id INTEGER PRIMARY KEY AUTOINCREMENT, "+ "name TEXT, tel TEXT);"); …
데이터베이스와 어댑터 SimpleCursorAdapter 객체는 데이터베이스와 화면 을 연결한다. 데이터베이스에서 데이터를 읽어서 정해진 레이아 웃으로 화면에 표시한다.
코드 작성
코드 작성
실행 결과
Lab: 영화 데이터베이스 만들기
Lab: 영화 데이터베이스 만들기
사용자 인터페이스
데이터베이스 구조
소스 일부(다운로드 소스 참조)
소스 일부(다운로드 소스 참조)
실행 결과