2014-11-14 6 views
0

로컬로 작업 할 수 있지만 parse.com과 동기화 된 SQLite DB를 갖고 싶은 작은 응용 프로그램을 만들고 있습니다. SyncDatabaseHelper가 github.com/ntoskrnl/DataSync에서 찾을 수 없습니다.

나는 https://github.com/ntoskrnl/DataSync의 모범을 따라하려고하지만 난이 문장에 문제가 있어요 :
// obtain our DatabaseHelper object 
SyncDatabaseHelper dbHelper = OpenHelperManager.getHelper(context, DatabaseHelper.class); 

// create and initialize SyncHelper object 
SyncHelper syncHelper = new SyncHelper(dbHelper); 
syncHelper.setUserId(ParseUser.getCurrentUser().getObjectId()); 
syncHelper.setLastSyncDate(new Date(lastSyncDate)); 

SyncDatabaseHelper

알려진 클래스 될 것 같지 않습니다.

+0

'문제가 있습니다.' 덜 구체적 일 수 있습니까? – njzk2

+0

미안하지만 충분히 명확하지 않다. SyncDatabaseHelper는 Java 클래스를 알고 있고 검색 할 수 없다. – user1809819

+0

나는 오타라고 생각한다. ORMlite의 OpenHelperManager.getHelper의 서명은'DatabaseHelper'의 인스턴스를 반환해야 함을 나타냅니다. – njzk2

답변

0

README 파일에 실수가있었습니다. 언급 해 주셔서 감사합니다. 업데이트했습니다.

njzk2으로 지적하면 GitHub에서 문제를 열어 보는 것이 좋습니다.

우선 데이터베이스 작업을 UI 스레드에서 수행하면 안됩니다. 백그라운드 스레드 (예 : AsyncTask 또는 볼트 작업)에서 DB로 모든 작업을 수행해야합니다.

두 번째로 엔티티 클래스에 추가 updatedAt 필드가 필요하지 않습니다. 확장 한 SyncEntity의 필드는 syncDate이고 updatedAtParseObject입니다. 또한, 당신은 직접 updatedAt을 ParseObject에서 변경할 수 없기 때문에 라이브러리는 리플렉션을 사용합니다.

updatedAt 대신 syncDate을 사용하면됩니다. 새로운 카테고리를 만들거나 기존 카테고리를 업데이트 할 때 코드에서 updatedAt을 사용한 것처럼 syncDate 필드를 설정하거나 업데이트해야합니다.

ProgressDialog pDialog = null; 

public void sync() { 
    // show progress dialog 
    pDialog = new ProgressDialog(getActivity()); 
    pDialog.setIndeterminate(true); 
    pDialog.setMessage("Synchronizing session data..."); 
    pDialog.setCancelable(false); 
    pDialog.show(); 

    // get last sync date from preferences 
    final Date lastSyncDate = new Date(mPrefHelper.getLong(
      Constants.APP_LAST_SYNC_TIMESTAMP, 0L)); 

    // Prepare SyncHelper 
    final SyncHelper syncHelper = new SyncHelper(HelperFactory.getHelper()); 
    syncHelper.setUserId(ParseUser.getCurrentUser().getObjectId()); 
    syncHelper.setLastSyncDate(lastSyncDate); 

    Task.callInBackground(
      new Callable<Long>() { 

       @Override 
       public Long call() throws Exception { 
        // save sync timestamp 
        long sync = System.currentTimeMillis(); 
        syncHelper.synObjects(CardioSessionEntity.class, true, new SyncCallback()); 
        return sync; 
       } 
      } 
    ).continueWith(
      new Continuation<Long, Object>() { 

       @Override 
       public Object then(Task<Long> task) throws Exception { 
        if (task.isFaulted()) { 
         Log.w(TAG, "Sync failed with exception", task.getError()); 
         if (getActivity() != null) { 
          Toast.makeText(getActivity(), "Sync failed.", 
            Toast.LENGTH_SHORT).show(); 
         } 
        } else if (task.isCompleted()) { 
         // save new sync timestamp to Preferences 
         mPrefHelper.putLong(Constants.APP_LAST_SYNC_TIMESTAMP, task.getResult()); 
        } 

        // refresh UI and hide progress dialog 
        refreshSessionList(); 
        if (pDialog != null) { 
         pDialog.dismiss(); 
        } 
        pDialog = null; 
        return null; 
       } 
      }, 
      Task.UI_THREAD_EXECUTOR); 
} 

내가 안드로이드 환경 설정에서 마지막 동기화 타임 스탬프를 저장하고 백그라운드에서 동기화를 수행하는 볼트 작업을 사용 : 내 프로젝트 중 하나의 라이브러리를 사용하는 방법은 다음과

이다. 동기화는 syncHelper.syncObjects()을 호출하여 수행됩니다. 엔티티 클래스 인 userAware 플래그와 SyncCallback 개체 (null 일 수 있음)를 제공합니다.

앱에서 나는 Sync 버튼이 있습니다. 사용자가 클릭 할 때마다 위에 표시된 방법 sync()을 호출합니다. 업데이트 된 각 객체에 대해 SyncCallback의 해당 메소드가 호출됩니다. 특정 사례를 들어

, 난 당신이 userId 필요가없는 가정, 그래서 당신은 동기화를 수행 할 때마다 당신은

// Do this in the background 

// save sync timestamp 
long sync = System.currentTimeMillis(); 
// sync Category.class 
syncHelper.synObjects(Category.class); 
// return sync timestamp to save it in the later 
return sync; 

AsyncTask.doInBackground() 내에서 전화 호출 할 수 있습니다.

syncDate은 선택 사항입니다. lastSyncDate을 제공하지 않으면 라이브러리는 서버의 모든 개체를 요청합니다.

라이브러리는 데이터베이스 엔터티 간의 관계를 지원하지 않으므로 (인식하지 못함) 여러 엔터티 클래스를 동기화하는 경우 SyncCallback을 사용하여 저장 작업을 처리해야합니다. 메소드 onSaveLocally()onSaveRemotely()은 persist/update (로컬 DB) 또는 save (parse.com) 직전에 호출됩니다.

+0

답장을 보내 주셔서 감사합니다. – user1809819

+0

@ user1809819 질문 게시글에 코드를 추가해야합니다 (답변을 쓸 필요 없음). 나는 당신을 위해 질문을 편집하고 내 대답을 업데이트 할 것입니다. – ntoskrnl

+0

@ user1809819, 더 자세한 설명이 필요하면 GitHub에서 문제를 열어주세요 : https://github.com/ntoskrnl/DataSync/issues – ntoskrnl