코딩을 업무로 하며 살고 있지만, 집에서는 코딩하고 글 쓰고 하는 일이 근래에 거의 없었는데, 

 

최근에 오랜만에 뭔가 정리를 해야 될것 같은 구현들이 있어 정리도 할겸 구조도 잡을겸 정리하다보니, 

 

생각보다 Database를 사용하는 부분에 있어 데이터 와 코드를 구분해서 구현하는 경우가 많이 없는 것같아서 정리도 할겸 해서 글을 남겨둔다.

 

Android에서 database를 사용하는 방법은 여러 도구들이 있고, 예제들도 많이 있는데, 코딩을 할때 데이터로서 관리해야 될 부분과, 코드로서 작성해서 관리해야 될 부분을 좀 많이 나누고 정리하는 편이다 보니 데이터베이스를 구성하는 테이블의 스키마, 즉 "컬럼 이름", "컬럼 데이터 타입", "컬럼 제약"등은 구현이 아닌 데이터 그자체로서 관리하여 이후 실제 구현은 그 것들을 사용할때만 코드로 작성하여 분리해두면 이후 구현은 자주 바뀌고 때에 따라 여러 처리를 할수도 있지만, 데이터 베이스를 구성하는 스키마는 코드보다는 많이 바뀔일이 발생하지 않는다.

table 생성에 필요한 정보는 asset으로 table_main.json이라는 파일에 정리해두고, SQLiteOpenHelper의 구현에서 AssetManager를 이용하여 json파일을 읽어들인 다음 그

규칙에 맞는 테이블을 생성하는 단순하고 간단한 접근 방법이다.

 

테이블의 정의는 아래와 같이 하였다.

각각의 필드는 아래와 같은 의미를 가진다.

 name : 테이블의 이름

 schemas : 테이블의 스키마 정보(컬러명, 데이터 타입, 제약,...)

 version : 테이블의 버전, 이 부분은 이후 데이터 베이스 업그레이드시 이용하기 위해 테이블 버전 관리

 

table_main.json을 읽어온 다음 실제 데이터 베이스에 테이블을 생성하는 구현은 아래와 같다.

SQLiteOpenHelper의 onCreate 에서 db에 json에서 읽어드린 정보를 이용하여 table 의 이름과 생성 스키마를 조합하여 테이블을 생성하도록 할수 있다.

 

이후 버전 관리등이 필요한 경우 SQLiteOpenHelper의 onUgrade, onDowngrade가 호출되는데 이때는 Database 의 버전과 table의 버전을 비교하여 관리하는 방법으로 구현을 하거나, db 자체에 table들의 버전정보를 기록해두었다가, json이 변경되면 자동으로 업그레이드를 하도록 하는 방법으로 구현을 할수도 있다.

 

이 부분은 다음에 또 정리할때 이어서 작성하도록 하겠다.

블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

안드로이드는 추가된 어카운트에 동기화 기능을 추가하기 아주 쉬운 Sync Adapter 인터페이스를 제공하고 있다.


그 구현하는 방법도 그렇게 어렵지 않게, 서비스 1개, AndroidManifest meta 정의 1개, xml 정의 1개로 기본적인 동기화 서비스를 제공할수 있도록 되어있다.


물론 해당 계정에 대한 인증같은 부분은 따로 처리를 해주어야 하지만, 해당 계정의 특정 authority(동기화 항목)에 대한 동기화는 아래 와 같은 세가지를 구현하면 기본적인 준비가 되게 된다.


1.Sync Adapter 정의 xml 추가

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.android.contacts"
    android:accountType="[계정타입,예를 들면 com.google 같은것]"
    android:supportsUploading="[업로드지원여부] true"
/>


2.Sync Adapter Service 구현

public class SyncService extends Service {

	@Override
	public void onCreate() {			
		
	}

	@Override
	public IBinder onBind(Intent intent) {
		return new SyncAdapter(getApplicationContext(), true).getSyncAdapterBinder();
	}
	
        // Sync Adapter
	public static class SyncAdapter extends AbstractThreadedSyncAdapter {	
	
		public SyncAdapter(Context context, boolean autoInitialize) {
			super(context, autoInitialize);			
		}	
	
		@Override
		public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {				
			// Sync 가 실행될때 할일들
		}
	
		@Override
		public void onSyncCanceled() {
			super.onSyncCanceled();	
		       // Sync가 취소 될때 할일들
		}
	}
}


3.Android Manifest 수정


            
                
            

            
     


블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

아주 아주 오래전 간단한 서비스를 하는 어플을 하나 만들었는데, 어플이 웹과 연동도 되어야 하고, 주기적으로 정보도 갱신을 해야되는데 어플에서는 네트워크 비용이 최대한 들어가지 않도록 설계를 해야 했었다.


그래서 고민하고 고안한 방법이, 서비스를 제공하는 어플은 단지 별도로 제작한 웹에서 정보를 읽어만 오고, 해당 웹에 정보를 채워넣기 위해서 웹앱을 하나 만들어서 주기적으로 어플에서 로딩만 하게 하면, 모든 처리는 서버내에서 이루어지게 되므로, 스마트폰에서는 별도의 추가적인 네트워크가 많이 발생하지 않게 되었다.


일단 주기적으로 특정한 웹페이지를 계속해서 로딩하는 방법은 여러가지가 있지만 아주 간단하게, 서비스 하나와 타이머로 스마트폰이 켜져있고 네트워크가 연결되어있는한 계속해서 실행할수 있다.


코드는 아래와 같이 아주 간단하게 만들어주면 된다.



public class Scheduler extends Service {
	private String TAG = "Scheduler";
	private static final String url = "[웹페이지주소]";
	private static final long delta = 30 * 60 * 1000; // 30분마다 한번

	@Override
	public void onCreate() {
		

	}

	@Override
	public int onStartCommand(final Intent intent, int flags, int startId) {
		super.onStartCommand(intent, flags, startId);

		start();
		return START_STICKY;  // 이 서비스는 불멸이다.

	}

	private void start() {

		Timer timer = new Timer();
		
		timer.schedule(new TimerTask() {
			public void run() {
				URL obj;
				try {
					obj = new URL(url);
					HttpURLConnection conn = (HttpURLConnection) obj.openConnection();

					BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
					String inputLine;

					while ((inputLine = in.readLine()) != null) {
						Log.v(TAG, inputLine);
					}
					in.close();
				} catch (MalformedURLException e) {					
					e.printStackTrace();
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
		}, 0, delta);
	}

	@Override
	public IBinder onBind(Intent arg0) {		
		return null;
	}
}
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,



넥서스 7 2세대는 못찍고.. 그걸 넣을 케이스를 따로 구매해서 그 케이스만 찍었음..



집에 아이패드2도 있는데, 같은 게임(아스팔트 에어폰)을 설치해서 돌려봤는데.. 넥서스7 2세대가 더 잘돌아간다.. 뭐 물론 몇년 전에 나온 제품과 비교한다는것 자체가 좀 불공정하긴 하지만... 안드로이드 탭 제품은 안살려고 했는데.. 이 제품은 아주 만족이다...


나는 전화기도 그렇고, 탭도 그렇고 ... 제조사의 제품이 아닌 순정 제품이 좋드라~~~ 안무겁고...


강추천!!!


블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

최근에 만드는 앱들은 모두 아들이 가지고 놀기 위한 앱들이다...


얼마전에 Glass Harp 연주 동영상을 같이 보고 있었는데, 아들이 "아빠, 이거 어디서 나는소리야??" 하고 관심을 보여서...


Glass Harp의 샘플을 직접 구해서.. 일일이 주파수를 추출해서 3,4,5 옥타브의 음원 세트를 만들었는데..


3옥타브는 휴대폰에서는 아무리 재생해도 잘 들리지가 않아서... 그냥 대충 만들어올렸는데..


올린지 하루만에 ㅠ.ㅠ 별점 1 ... 


역시 대충 만든앱은 누가 봐도 별점 1....


그래서 앱자체를 아예 제거해버리고 새로 만들어서 올렸다.


아이가 쓰기 쉽게... 한글도 넣고... 그동안 너무 무성의 했던듯.... 사실 아들이 아직 한글은 모르고 A,B,C를 더 잘알아서...


https://play.google.com/store/apps/details?id=com.hopeisagoodthing.glasspiano&feature=more_from_developer#?t=W251bGwsMSwxLDEwMiwiY29tLmhvcGVpc2Fnb29kdGhpbmcuZ2xhc3NwaWFubyJd





블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,