안드로이드 어플을 개발하다보면, DataBase를 사용해야 하는 경우가 간혹있다. 우리가 많이 사용하는 전화번호부, 일정관리 어플, 메시지 프로그램들이 모두가 DB를 자체적으로 사용하고 있는 것들이다.
안드로이드는 프레임웍에서 SQLite를 사용하기 쉽게 제공하고 있다. 그래서 오늘은 정말 정말 정말, 간단한 진짜 아무런 기능이 아직 준비되어 있지 않은 기본적인 Provider의 기본중의 기본 클래스만 만들어서 공유하고자 한다. 이후 DB를 사용하거나, openFile(API 9 GingerBread 부터 지원)과 같은 API를 사용해서 기능을 붙여나가고 진짜 DB를 써야 할 이유가 있을때 적절한 설명과 예제를 공유하도록 하겠지만, 오늘은 정말 기 기초적인 Provider의 껍데기만을 만들어뒀다.
나중에 필요할일이 생기면 그대로 복사해서 필요한 것들 추가하고 바로 사용할수 있게함이 목적이다.
Provider를 만들기 위해서는 AndroidManifest.xml에 provider를 선언해줘야 한다, ContentProvider는 내부적으로 Binder Interface를 통해서 IPC를 지원하고 있다.그래서 Manifest File에 내가 제공하는 provider정보를 명세해주어야지 다른 어플에서도 내가 제공하는 Provider의 Authority로 DB를 접근할수 있게 할수있다.
1. AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hoepisagoodthing.simpleprovider" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="15" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme"> <provider android:authorities="com.hopeisagoodthing.simpleprovider" android:enabled="true" android:exported="true" android:label="Coolkim" android:name="com.hopeisagoodthing.simpleprovider.Provider" android:syncable="false" > </provider> </application> </manifest>
2. Provider와 DataBaseHelper Class
package com.hopeisagoodthing.simpleprovider; import java.io.File; import java.io.FileNotFoundException; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.util.Log; import android.util.SparseArray; public class Provider extends ContentProvider{ private static final String TAG="Provider"; private static final String authority = "com.hopeisagoodthing.simpleprovider"; private SQLiteOpenHelper dbHelper; private SQLiteDatabase db; private UriMatcher uriMatcher; private interface Scheme{ interface Table{ static final String NAME="name"; static final String ADDR="address"; static final String INTEREST="interest"; } interface Match{ static final int NAME=1; static final int ADDR=2; static final int INTEREST=3; } } private static final SparseArray<Stringgt; tableMap = new SparseArraylt;Stringgt;(); static{ tableMap.put(Scheme.Match.NAME, Scheme.Table.NAME); tableMap.put(Scheme.Match.ADDR, Scheme.Table.ADDR); tableMap.put(Scheme.Match.INTEREST, Scheme.Table.INTEREST); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int match = uriMatcher.match(uri); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } return db.delete(tableMap.get(match), selection, selectionArgs); } @Override public String getType(Uri uri) { int match = uriMatcher.match(uri); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } return null; } @Override public Uri insert(Uri uri, ContentValues values) { int match = uriMatcher.match(uri); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } long rowId = db.insert(tableMap.get(match), null, values); uri = ContentUris.withAppendedId(uri, rowId); getContext().getContentResolver().notifyChange(uri, null); return uri; } @Override public boolean onCreate() { dbHelper = new SimpleDatabaseHelper(getContext()); db = dbHelper.getWritableDatabase(); uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(authority, Scheme.Table.NAME, Scheme.Match.NAME); uriMatcher.addURI(authority, Scheme.Table.ADDR,Scheme.Match.ADDR); uriMatcher.addURI(authority, Scheme.Table.INTEREST, Scheme.Match.INTEREST); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int match = uriMatcher.match(uri); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } return db.query(tableMap.get(match), projection, selection, selectionArgs, null, null, sortOrder); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int match = uriMatcher.match(uri); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } return db.update(tableMap.get(match), values, selection,selectionArgs); } @Override public ParcelFileDescriptor openFile (Uri uri,String mode){ ParcelFileDescriptor fd = null; String filename = uri.getQueryParameter("filename"); if(filename == null || filename.isEmpty()){ throw new UnsupportedOperationException(); } File dir = getContext().getFilesDir(); if(dir.exists() == false){ dir.mkdir(); } String filepath = dir.getAbsolutePath()+ "/" +filename; try { fd = ParcelFileDescriptor.open(new File(filepath), ParcelFileDescriptor.MODE_CREATE|ParcelFileDescriptor.MODE_READ_WRITE); } catch (FileNotFoundException e) { Log.e(TAG,"Unable to open file "+ filepath); } return fd; } @Override public int bulkInsert(Uri uri, ContentValues[] values) { long rowId = -1; int count = 0; int match = uriMatcher.match(uri); db.beginTransaction(); switch(match){ case Scheme.Match.NAME: break; case Scheme.Match.ADDR: break; case Scheme.Match.INTEREST: break; default: throw new UnsupportedOperationException(); } for(ContentValues value:values){ rowId = db.insert(tableMap.get(match), null, value); if(rowId > 0 ){ count++; } } db.setTransactionSuccessful(); db.endTransaction(); uri = ContentUris.withAppendedId(uri, rowId); getContext().getContentResolver().notifyChange(uri, null); return count; } private class SimpleDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "simple.db"; private static final int DATABASE_VERSION = 1; private static final String NAME_TABLE_CREATE = "CREATE TABLE " + "name" + " (" + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT," + "name" + " TEXT "+");"; private static final String ADDRESS_TABLE_CREATE = "CREATE TABLE " + "address" + " (" + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT," + "address" + " TEXT ," + "name_id" + " INTEGER " + ");"; private static final String INTEREST_TABLE_CREATE = "CREATE TABLE " + "interest" + " (" + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT," + "interest" + " TEXT ," + "name_id" + " INTEGER " + ");"; protected SimpleDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(NAME_TABLE_CREATE); db.execSQL(ADDRESS_TABLE_CREATE); db.execSQL(INTEREST_TABLE_CREATE); } catch (Exception e) { Log.e(TAG, "onCreate: Exception - " + e.getMessage()); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } }
'코딩하고 > Android' 카테고리의 다른 글
Android NDK 이용해서 개발할때 Eclipse CDT 설치 (0) | 2012.11.27 |
---|---|
Android 개발 환경 설치하기(한큐에 끝!!!) (0) | 2012.11.27 |
Fragment 다루기 (아주 심플하게..) (0) | 2012.11.15 |
아날로그 시계 만들기, 헐!!! 코딩없이 된다. (1) | 2012.11.14 |
HttpClient 사용하기 (0) | 2012.10.25 |