2012-04-08 93 views
0

我開發了一個應用程序,允許用戶保存他最喜歡的兩個停車位。它使用服務從sqlite數據庫中檢索相關的停車信息。在數據庫中我有這樣的方法找到的第一個條目:sqlite android查詢(光標)

public Cursor firstentry(){ 
     String select = "SELECT PREF1, PREF2 FROM parking_table WHERE id =1"; 
     Cursor cursor = db.rawQuery(select, null); 
    return cursor; 

每次我跑我的應用程序出現強制關閉的錯誤,當服務嘗試使用命令調用這個方法:

Cursor c = dh.firstentry(); 

當我評論它時,它會給出錯誤,這些應用程序完美無缺。

以下是錯誤的logcat的:

04-08 18:56:38.673: E/AndroidRuntime(13166): FATAL EXCEPTION: Timer-0 
04-08 18:56:38.673: E/AndroidRuntime(13166): java.lang.NullPointerException 
04-08 18:56:38.673: E/AndroidRuntime(13166): at stefan.testservice.ConnectionService$1.run(ConnectionService.java:64) 
04-08 18:56:38.673: E/AndroidRuntime(13166): at java.util.Timer$TimerImpl.run(Timer.java:284) 
04-08 18:56:39.654: E/ActivityThread(13166): Activity stefan.testservice.TestserviceActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
04-08 18:56:39.654: E/ActivityThread(13166): android.app.IntentReceiverLeaked: Activity stefan.testservice.TestserviceActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:756) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:551) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:795) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.ContextImpl.registerReceiver(ContextImpl.java:782) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.ContextImpl.registerReceiver(ContextImpl.java:776) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 
04-08 18:56:39.654: E/ActivityThread(13166): at stefan.testservice.TestserviceActivity$1.onServiceConnected(TestserviceActivity.java:280) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1064) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1081) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.os.Handler.handleCallback(Handler.java:587) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.os.Looper.loop(Looper.java:123) 
04-08 18:56:39.654: E/ActivityThread(13166): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-08 18:56:39.654: E/ActivityThread(13166): at java.lang.reflect.Method.invokeNative(Native Method) 
04-08 18:56:39.654: E/ActivityThread(13166): at java.lang.reflect.Method.invoke(Method.java:507) 
04-08 18:56:39.654: E/ActivityThread(13166): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-08 18:56:39.654: E/ActivityThread(13166): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-08 18:56:39.654: E/ActivityThread(13166): at dalvik.system.NativeStart.main(Native Method) 
04-08 18:56:40.054: E/ActivityThread(13166): Activity stefan.testservice.TestserviceActivity has leaked ServiceConnection [email protected] that was originally bound here 
04-08 18:56:40.054: E/ActivityThread(13166): android.app.ServiceConnectionLeaked: Activity stefan.testservice.TestserviceActivity has leaked ServiceConnection [email protected] that was originally bound here 
04-08 18:56:40.054: E/ActivityThread(13166): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:938) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:833) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.app.ContextImpl.bindService(ContextImpl.java:867) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.content.ContextWrapper.bindService(ContextWrapper.java:347) 
04-08 18:56:40.054: E/ActivityThread(13166): at stefan.testservice.TestserviceActivity.doBindService(TestserviceActivity.java:290) 
04-08 18:56:40.054: E/ActivityThread(13166): at stefan.testservice.TestserviceActivity$DownloadTask.onPostExecute(TestserviceActivity.java:193) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.os.AsyncTask.finish(AsyncTask.java:417) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.os.AsyncTask.access$300(AsyncTask.java:127) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.os.Looper.loop(Looper.java:123) 
04-08 18:56:40.054: E/ActivityThread(13166): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-08 18:56:40.054: E/ActivityThread(13166): at java.lang.reflect.Method.invokeNative(Native Method) 
04-08 18:56:40.054: E/ActivityThread(13166): at java.lang.reflect.Method.invoke(Method.java:507) 
04-08 18:56:40.054: E/ActivityThread(13166): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-08 18:56:40.054: E/ActivityThread(13166): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-08 18:56:40.054: E/ActivityThread(13166): at dalvik.system.NativeStart.main(Native Method) 

任何幫助,因爲我什麼都試過和似乎沒有任何工作是非常讚賞。提前致謝!

編輯:

停車表代碼:

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, PREF1 TEXT, PREF2 TEXT)"); 
    } 
+0

發表您的parking_table定義。你是否跟着光標要求表的ID完全被_ID引用? – hovanessyan 2012-04-08 17:08:58

+0

如果我錯誤地理解了你,請糾正我,你是否建議我需要'_id = 1'而不是'id = 1'? – progdoc 2012-04-08 17:11:36

+0

ConnectionService.java line 64..post that line .. – 2012-04-08 17:14:57

回答

0

我設法解決它,一切都很好,我只需要啓動類對象。下面是代碼所需的行:在我的情況

this.yourobject = new class(this); 

是:

this.dh = new SQLHelper(this); 

希望它能幫助:)

0

其一個nullpointerexception意思大概是沒有在數據庫在那個時候。如果光標爲空,則需要處理

單步執行代碼實際上是查看確切內容爲空的唯一方法。更多的代碼是絕對必要但其很難告訴你貼什麼

+0

嗨,有數據,因爲服務開始延遲,我也通過自己插入虛擬數據來測試它,以確保空數據庫不是我的問題的來源。 – progdoc 2012-04-08 17:18:09

0

你rawsql運行,以便檢查是否準確的查詢的有效期爲您的數據庫,SELECT PREF1, PREF2 FROM parking_table WHERE id =1

是PREF1準確(與案例)列名??

+0

是的,sql是正確的,所以列的名字 – progdoc 2012-04-08 17:31:20

0

如果你沒有一個SQLite的瀏覽器軟件,獲得一個位置: SQLite Browser

它有助於當我與SQLite的工作。我之前遇到過這個問題,我通過將id參數添加到查詢中來解決此問題。從本質上講,你要查詢更改爲:

public Cursor firstentry(){ 
    String select = "SELECT id, PREF1, PREF2 FROM parking_table WHERE id =1"; 
    Cursor cursor = db.rawQuery(select, null); 
return cursor; 

不要忘記調用c.moveToFirst()如果c是遊標的名稱。

+0

試過了,沒有工作:/ – progdoc 2012-04-08 19:42:39