使用github.com/ntoskrnl/DataSync找不到SyncDatabaseHelper

时间:2014-11-14 20:49:03

标签: android sqlite orm sync

我正在开发一个小应用程序,我想在其中使用SQLite数据库在本地工作,但是它与parse.com同步。

我试图按照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似乎不是一个已知的类。

1 个答案:

答案 0 :(得分:0)

README文件中存在错误。谢谢你提及,我更新了它。

正如 njzk2 所指出的,最好在GitHub上打开一个问题。

首先,不应在UI线程上执行数据库操作。您应该在后台线程(例如AsyncTask或Bolts任务)中使用DB完成所有工作。

其次,您的实体类中不需要额外的updatedAt字段。您已扩展的SyncEntity已将字段syncDate映射到updatedAt的{​​{1}}。此外,您无法直接更改ParseObject中的ParseObject,因此库会使用反射。

只需使用updatedAt代替syncDate。当您创建新类别或更新现有类别时,您应该设置或更新实体的updatedAt字段 - 就像您在代码中使用syncDate一样。

以下是我在我的一个项目中使用该库的方法:

updatedAt

我在Android偏好设置中存储了上次同步时间戳,并使用螺栓任务在后台进行同步。通过调用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处理保存操作。它的方法SyncCallbackonSaveLocally()将在持久化/更新(在本地数据库中)或保存(到parse.com)之前调用。