2015-01-10 2 views
0

Я использую CouchBase Lite на Android и хочу подключиться к онлайн-базе данных, которую у меня есть на Cloudant. У меня есть некоторый код, но он не будет работать:Android + Cloudant + CouchBase = ошибка 404

public class MainActivity extends ActionBarActivity { 
final String TAG = "CouchBase"; 
Manager manager; 
String dbname = "foimess"; 
Database database; 
URL syncUrl; 
public static final String SYNC_URL = "https://drmenko.cloudant.com/"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    try { 
     manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS); 
     Log.d (TAG, "Manager created"); 
    } catch (IOException e) { 
     Log.e(TAG, "Cannot create manager object"); 
     return; 
    } 

    if (!Manager.isValidDatabaseName(dbname)) { 
     Log.e(TAG, "Bad database name"); 
     return; 
    } 

    try { 
     database = manager.getDatabase(dbname); 
     Log.d (TAG, "Database created"); 
    } catch (CouchbaseLiteException e) { 
     Log.e(TAG, "Cannot get database"); 
     return; 
    } 

     try { 
      syncUrl = new URL(SYNC_URL + dbname); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Replication push = database.createPushReplication(syncUrl); 
     Replication pull = database.createPullReplication(syncUrl); 
     pull.setContinuous(true); 
     push.setContinuous(true); 
     com.couchbase.lite.auth.Authenticator auth = new BasicAuthenticator("user", "pass"); 
     push.setAuthenticator(auth); 
     pull.setAuthenticator(auth); 

     push.addChangeListener(new Replication.ChangeListener() { 
      @Override 
      public void changed(Replication.ChangeEvent event) { 
       // will be called back when the push replication status changes 
      } 
     }); 
     pull.addChangeListener(new Replication.ChangeListener() { 
      @Override 
      public void changed(Replication.ChangeEvent event) { 
       // will be called back when the pull replication status changes 
      } 
     }); 
     push.start(); 
     pull.start(); 


} 

Я получил это в LogCat:

01-10 20:06:15.202: E/RemoteRequest(25122): Got error status: 404 for https://drmenko.cloudant.com/foimess/_session. Reason: Object Not Found 
01-10 20:06:15.202: D/Sync(25122): %s: return false 
01-10 20:06:15.202: E/RemoteRequest(25122): Got error status: 404 for https://drmenko.cloudant.com/foimess/_session. Reason: Object Not Found 
01-10 20:06:15.202: D/Sync(25122): %s: return false 
01-10 20:06:15.312: D/dalvikvm(25122): GC_CONCURRENT freed 304K, 6% free 7331K/7751K, paused 14ms+5ms, total 78ms 
01-10 20:06:15.902: E/RemoteRequest(25122): Got error status: 404 for https://drmenko.cloudant.com/foimess_session. Reason: Object Not Found 
01-10 20:06:15.902: D/Sync(25122): %s: return false 
01-10 20:06:15.902: E/Sync(25122): [email protected]: Session check failed 
01-10 20:06:15.902: E/Sync(25122): org.apache.http.client.HttpResponseException: Object Not Found 
01-10 20:06:15.902: E/Sync(25122): at com.couchbase.lite.support.RemoteRequest.executeRequest(RemoteRequest.java:217) 
01-10 20:06:15.902: E/Sync(25122): at com.couchbase.lite.support.RemoteRequest.run(RemoteRequest.java:101) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:150) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:264) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-10 20:06:15.902: E/Sync(25122): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-10 20:06:15.902: E/Sync(25122): at java.lang.Thread.run(Thread.java:856) 
01-10 20:06:15.902: E/Sync(25122): [email protected]: Progress: set error = org.apache.http.client.HttpResponseException: Object Not Found 
01-10 20:06:15.902: E/RemoteRequest(25122): Got error status: 404 for https://drmenko.cloudant.com/foimess_session. Reason: Object Not Found 
01-10 20:06:15.902: D/Sync(25122): %s: return false 
01-10 20:06:15.912: E/Sync(25122): [email protected]: Session check failed 
01-10 20:06:15.912: E/Sync(25122): org.apache.http.client.HttpResponseException: Object Not Found 
01-10 20:06:15.912: E/Sync(25122): at com.couchbase.lite.support.RemoteRequest.executeRequest(RemoteRequest.java:217) 
01-10 20:06:15.912: E/Sync(25122): at com.couchbase.lite.support.RemoteRequest.run(RemoteRequest.java:101) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:150) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:264) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-10 20:06:15.912: E/Sync(25122): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-10 20:06:15.912: E/Sync(25122): at java.lang.Thread.run(Thread.java:856) 
01-10 20:06:15.912: E/Sync(25122): [email protected]: Progress: set error = org.apache.http.client.HttpResponseException: Object Not Found 
01-10 20:12:52.262: E/ActivityThread(25122): Activity com.goran.helloworldcouchbase.MainActivity has leaked IntentReceiver com.couchbase.lite.android.[email protected] 41335210 that was originally registered here. Are you missing a call to unregisterReceiver()? 
01-10 20:12:52.262: E/ActivityThread(25122): android.app.IntentReceiverLeaked: Activity com.goran.helloworldcouchbase.MainActivity has leaked IntentReceiver com.couchbase.lite.android.[email protected] 41335210 that was originally registered here. Are you missing a call to unregisterReceiver()? 
01-10 20:12:52.262: E/ActivityThread(25122): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:792) 
01-10 20:12:52.262: E/ActivityThread(25122): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:593) 
01-10 20:12:52.262: E/ActivityThread(25122): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1120) 
01-10 20:12:52.262: E/ActivityThread(25122): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1107) 
01-10 20:12:52.262: E/ActivityThread(25122): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1101) 
01-10 20:12:52.262: E/ActivityThread(25122): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:365) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.android.AndroidNetworkReachabilityManager.startListening(AndroidNetworkReachabilityManager.java:50) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.NetworkReachabilityManager.addNetworkReachabilityListener(NetworkReachabilityManager.java:26) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.replicator.ReplicationInternal.initNetworkReachabilityManager(ReplicationInternal.java:299) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.replicator.ReplicationInternal.start(ReplicationInternal.java:239) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.replicator.ReplicationInternal$11.doIt(ReplicationInternal.java:1037) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.replicator.ReplicationInternal$11.doIt(ReplicationInternal.java:1033) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateConfiguration$3.doIt(StateConfiguration.java:135) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateConfiguration$3.doIt(StateConfiguration.java:133) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateRepresentation.executeEntryActions(StateRepresentation.java:118) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateRepresentation.enter(StateRepresentation.java:97) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateMachine.publicFire(StateMachine.java:199) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.github.oxo42.stateless4j.StateMachine.fire(StateMachine.java:126) 
01-10 20:12:52.262: E/ActivityThread(25122): at com.couchbase.lite.replicator.ReplicationInternal$1.run(ReplicationInternal.java:191) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:150) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:264) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-10 20:12:52.262: E/ActivityThread(25122): at java.lang.Thread.run(Thread.java:856) 

Что я делаю неправильно? Я что-то пропустил в коде или на сервере?

+0

Доступ в Интернет добавлен? – Simas

+0

Да, в манифесте –

ответ

0

Первый URL-адрес, который 404s, https://drmenko.cloudant.com/foimess/_session, неверен - он должен быть https://drmenko.cloudant.com/_session. Вероятно, это означает, что дальнейшие запросы не аутентифицированы правильно.

+0

OK! Я теперь добавил SYNC_URL = "https://drmenko.cloudant.com", теперь я получаю эту ошибку: E/Sync (13570): PullerInternal stopGraceful.run() завершено E/Sync (13570): com. [email protected] checkSessionAtPath() response: {ok = true, info = {authentication_db = _users, authentication_handlers = [cookie, default], authenticated = default}, userCtx = {name = drmenko, role = [ _admin, _reader, _writer]}} /RemoteRequest (13570): Получил статус ошибки: 403 для https://drmenko.cloudant.com/_local/2e7e23499d125a5dd8cfc93247fcc8ba58500c01. Причина: Запрещено –

+0

Таким образом, есть еще некорректный URL-адрес: https://drmenko.cloudant.com/_local. https://drmenko.cloudant.com не является самой базой данных - она ​​находится на уровне выше. Допустимым URL-адресом базы данных будет https://drmenko.cloudant.com/mydb, а допустимым URL-адресом _local doc будет https://drmenko.cloudant.com/mydb/_local/somedoc. Это звучит как проблема с вашим Couchbase Lite, но я должен отложить до людей Couchbase, что касается правильной настройки. –

Смежные вопросы