我正在开发一个小应用程序,我想在其中使用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
似乎不是一个已知的类。
答案 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
处理保存操作。它的方法SyncCallback
和onSaveLocally()
将在持久化/更新(在本地数据库中)或保存(到parse.com)之前调用。