안드로이드 어플을 개발하다보면, 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) {
		}
	}
}

저작자 표시
신고

+ Recent posts

티스토리 툴바