2015-01-10 40 views
0

我在Android上使用CouchBase Lite並希望連接到我在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

已添加Internet權限? – Simas

+0

是的,在清單 –

回答

0

404s的第一個網址,https://drmenko.cloudant.com/foimess/_session,不正確 - 應該是https://drmenko.cloudant.com/_session。這可能意味着沒有進一步的請求被正確認證。

+0

行!我現在把SYNC_URL =「https://drmenko.cloudant.com」,現在我得到這個錯誤: E/Sync(13570):PullerInternal stopGraceful.run()完成 E/Sync(13570):com。 [email protected] checkSessionAtPath()響應:{ok = true,info = {authentication_db = _users,authentication_handlers = [cookie,default],authenticated = default},userCtx = {name = drmenko,roles = [ _admin,_reader,_writer]}} /RemoteRequest(13570):出現錯誤狀態:403 for https://drmenko.cloudant.com/_local/2e7e23499d125a5dd8cfc93247fcc8ba58500c01。原因:禁止 –

+0

因此,網址中仍有一個不正確的網址:https://drmenko.cloudant.com/_local。 https://drmenko.cloudant.com本身不是數據庫 - 它在上面的級別。有效的數據庫URL將爲https://drmenko.cloudant.com/mydb,並且有效的_local doc URL將爲https://drmenko.cloudant.com/mydb/_local/somedoc。這聽起來像是你的Couchbase Lite的一個問題,但我不得不推遲到Couchbase的人關於什麼是正確的設置。 –