README 파일에 실수가있었습니다. 언급 해 주셔서 감사합니다. 업데이트했습니다.
njzk2으로 지적하면 GitHub에서 문제를 열어 보는 것이 좋습니다.
우선 데이터베이스 작업을 UI 스레드에서 수행하면 안됩니다. 백그라운드 스레드 (예 : AsyncTask
또는 볼트 작업)에서 DB로 모든 작업을 수행해야합니다.
두 번째로 엔티티 클래스에 추가 updatedAt
필드가 필요하지 않습니다. 확장 한 SyncEntity
의 필드는 syncDate
이고 updatedAt
은 ParseObject
입니다. 또한, 당신은 직접 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) 직전에 호출됩니다.
'문제가 있습니다.' 덜 구체적 일 수 있습니까? – njzk2
미안하지만 충분히 명확하지 않다. SyncDatabaseHelper는 Java 클래스를 알고 있고 검색 할 수 없다. – user1809819
나는 오타라고 생각한다. ORMlite의 OpenHelperManager.getHelper의 서명은'DatabaseHelper'의 인스턴스를 반환해야 함을 나타냅니다. – njzk2