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

 

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

 

생각보다 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이 변경되면 자동으로 업그레이드를 하도록 하는 방법으로 구현을 할수도 있다.

 

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

블로그 이미지

커뉴

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

,

오늘 아침 눈뜨자 마자 갑자기 코딩이 하고 싶어서 일요일인데도 불구하고 6시 10분에 눈이 번쩍 하고 떠졌다.


꿈을 꾼것인지, 뭔지 ... 


어제는 계속 낚시하는 공부만 하다가 잤는데, 눈뜨자마자 그간 미뤄왔던 안드로이드 앱 수정과 그에 맞는 웹호스팅중인 php 코드도 좀 수정을 해야 겠다 마음을 먹고 바로 컴퓨터를 켰다.


오전내내 만들고 수정한것은 사람들이 대체 무엇을 검색하고 왜 검색하는지 다음,네이버 등을 들어가서 일일이 클릭해서 보는게 귀찮아서 내가 보고 싶을때, 사람들이 많이 본 검색어와 뉴스들을 한방에 긁어오는 웹앱을 만들었다. 근데 웹앱으로 만들어두니까, 가독성도 떨어지고, 나중에 저장해뒀다가 보는것이 불편해서 아예 이슈만 저장하는 블로그를 하나 팠다.


한번씩 긁 읽어볼 필요가 있을때, 즐겨찾기 해둔 웹앱을 실행해서 긁어다가 블로그에 넣고 앉아서 클릭 또는 넣어놓고 출퇴근중에 하나씩 보면 꿀같은 휴식을 취할수가 있다.


이런 웹앱 만드는것은 너무나 간단해서 아주 아주 오래전에 만들어뒀던 php 코드를 살짝 수정해서 완성했다.

처음에는 물론 버그가 있어서, 제일처음 글 올린것은 링크가 다 ....깨졌다.


오늘 자기전에 긁어서 저장해놨다가 내일 출근할때 봐야지.


이런 웹앱을 만드는데는 다른 것을 많이 사용하는 것보다 php로 curlsimplehtmldom 라이브러리만 있으면 만들수 있다.


예제 코드를 하나 올려보면 아래와 같이 함수로 하나 만들어두면 글을 긁어올수 있고, simplehtmldom을 사용하여 요소별로 분리할수 있다.





이것을 하고 나니, 오후가 되었는데, 왠지 오늘 코딩빨이 좀 받는 느낌이 들어서, 그간 귀찮아서 미뤄두었던 kpop app 의 업데이트를 위한 서버 작업, 앱 수정 배포도 했다.




생각보다 많은 외국인들이 사용해주고 메일도 주고 해서 업데이트를 빨리 해야지 하고 있었는데, 지난 몇년간 시달림이 있다보니, 이런 여유시간도 많이 없었고, 여유시간에 코딩을 한다는 것 자체가 정말 오랫만이되어버려서 2년인가 4년 만에 코딩을 다시 한 느낌이 든다.


지금 업데이트 올려보니, 그간 구글에서 많은 정책이 바뀌어서 그것 하나 하나 맞춰주느라.. 진땀 뺐다.


그리고 그간 사용하던 도메인하고, 웹호스팅도 다음달부로 만료된다고 해서 그것들도 다 연장하고 결재하고나니 일요일이 휘리릭 다갔네~


그래도 뭔가 그간 화장실 가고 싶은데 못갔던 느낌으로 몇년간 지내다가 이참에 정리해버리니 뭔가 정리된 느낌도 들고, 이제 앱 리뷰 오는거랑 해서 잘 업데이트 하면서 관리좀 해야지~~ 하며 마음을 다 잡았다.



블로그 이미지

커뉴

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

,

안드로이드는 추가된 어카운트에 동기화 기능을 추가하기 아주 쉬운 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;
	}
}
블로그 이미지

커뉴

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

,

의외로 간단한건데, 가끔 까먹고  Custom Theme를 만들거나 수정해서 title bar를 제거하는 경우가 있는데, 

다음부터는 아래와 같이 manifest에서 아예 제거해주면 된다.



<activity
            android:name=".CandleActivity"
            android:label="@string/title_activity_candle" 
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>



너무 간단해서 잘 까먹게 된다. ㅠ.ㅠ




블로그 이미지

커뉴

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

,