到目前为止,我正在使用Cloudant-sync android最新版本:2.0.2并针对Android api 21+ 我的服务器数据库是CouchDB 2.1.0
我正在尝试从我的Android应用程序触发复制拉动,以更新本地数据库。 我将源URI提供给ReplicatorBuilder,如: “https:// user:password @ databaseurl / db_name” (详见https://github.com/cloudant/sync-android/blob/master/doc/replication.md) 但是在生成的复制器对象中,如果我检查“replicator.strategy.sourceDb”,那么db uri就是 “https:// databaseurl / db_name”,所以,我得到了非常规的(如果我停用数据库服务器上的安全检查,它可以正常工作)
这是我正在运行的代码:
public ReplicationListener pullAllAsync(Databases db_name) {
try {
URI uri = db_name.getServerURI();
DocumentStore ds = DocumentStore.getInstance(new File(db_name.getMobilePath(), db_name.toString()));
Replicator replicator = ReplicatorBuilder.pull().from(uri).to(ds).build();
ReplicationListener listener = new ReplicationListener(replicator);
replicator.getEventBus().register(listener);
replicator.start();
return listener;
} catch (Exception e) {
e.printStackTrace();
LogRepository.getInstance().escribirLog(LogRepository.TipoLog.ERROR, null, e, true);
return null;
}
}
我做错了吗?
谢谢!
答案 0 :(得分:0)
好吧,问题似乎在于CookieAuthentication(当URI在URI中传递时,它是Replicator的默认身份验证方法) 我真的不知道它为什么会失败,因为CouchDB服务器实例被配置为接受CookieAuthentication。
无论如何,这可能不是最好的解决方案,但是足够好的解决方法。我通过强制BasicAuthentication方法完成了这项工作,如下所示:
public ReplicationListener pullAllAsync(Databases db_name) {
try {
URI uri = db_name.getServerURI();
DocumentStore ds = DocumentStore.getInstance(new File(db_name.getMobilePath(), db_name.toString()));
Replicator replicator = ReplicatorBuilder
.pull()
.from(uri)
.to(ds)
//WORKAROUND: forces BasicAuthentication method instead of CookieAuthentication
.addRequestInterceptors(new BasicAuthInterceptor(uri.getRawUserInfo()))
.build();
ReplicationListener listener = new ReplicationListener(replicator);
replicator.getEventBus().register(listener);
replicator.start();
return listener;
} catch (Exception e) {
e.printStackTrace();
LogRepository.getInstance().escribirLog(LogRepository.TipoLog.ERROR, null, e, true);
return null;
}
}