2014-04-01 22 views
0

在我的應用程序中有很多數據庫操作,所以我創建了許多遊標來檢索數據,並且在Async Task中也使用了很少的遊標。現在我的問題是關閉遊標和數據庫的地方。何處關閉在Activity中關閉遊標和數據庫對象沒有任何異常

當我關閉遊標onCreate的異步操作我得到Null Pointer Exception後,也如果我關閉在還是我得到Null pointer exception,所以我在onDestroy關閉遊標和數據庫。

現在我很困惑這種方法是否正確..我想了解什麼是關閉活動中游標和數據庫的最佳方式,而不會對數據庫操作產生任何影響。

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.stockdetail); 
     //Helptext.setVisibility(View.INVISIBLE); 
     Declerations(); 

     d=Database.getInstance(getApplicationContext()).getWritableDatabase(); 



     new popdailydata().execute(); 
// Above is async task so I have closed after above statement, but if I close cursor getting Null pointer exception 

protected void onDestroy() { 
     // TODO Auto-generated method stub 
    super.onDestroy(); 
    selectdate.close(); 
    Database.getInstance(getApplicationContext()).close(); 

    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     //selectdate.close(); --- At this point also I am getting nullpointer exception 
     Database.getInstance(getApplicationContext()).close(); 
    } 

04-01 17:03:48.045: D/dalvikvm(1288): Late-enabling CheckJNI 
04-01 17:03:50.021: D/libEGL(1288): loaded /system/lib/egl/libEGL_genymotion.so 
04-01 17:03:50.113: D/(1288): HostConnection::get() New Host Connection established 0xb90bb5c8, tid 1288 
04-01 17:03:50.177: D/libEGL(1288): loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
04-01 17:03:50.181: D/libEGL(1288): loaded /system/lib/egl/libGLESv2_genymotion.so 
04-01 17:03:50.773: W/EGL_genymotion(1288): eglSurfaceAttrib not implemented 
04-01 17:03:50.797: E/OpenGLRenderer(1288): Getting MAX_TEXTURE_SIZE from GradienCache 
04-01 17:03:50.861: E/OpenGLRenderer(1288): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
04-01 17:03:50.865: D/OpenGLRenderer(1288): Enabling debug mode 0 
04-01 17:03:54.645: D/dalvikvm(1288): GC_FOR_ALLOC freed 102K, 1% free 16948K/17072K, paused 89ms, total 96ms 
04-01 17:03:54.709: D/AndroidRuntime(1288): Shutting down VM 
04-01 17:03:54.725: W/dalvikvm(1288): threadid=1: thread exiting with uncaught exception (group=0xa4c45648) 
04-01 17:03:54.745: E/AndroidRuntime(1288): FATAL EXCEPTION: main 
04-01 17:03:54.745: E/AndroidRuntime(1288): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.portfoliomanager/com.example.StockDirector.stockmanager}: java.lang.NullPointerException 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.os.Looper.loop(Looper.java:137) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at java.lang.reflect.Method.invoke(Method.java:525) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at dalvik.system.NativeStart.main(Native Method) 
04-01 17:03:54.745: E/AndroidRuntime(1288): Caused by: java.lang.NullPointerException 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at com.example.StockDirector.stockmanager.onCreate(stockmanager.java:81) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.Activity.performCreate(Activity.java:5133) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
04-01 17:03:54.745: E/AndroidRuntime(1288):  ... 11 more 
04-01 17:03:57.889: I/Process(1288): Sending signal. PID: 1288 SIG: 9 
+0

您還沒有表現出什麼,你用你的'Cursor'爲或者顯示顯示NPE的logcat輸出。 「遊標」必須在任何應用程序組件需要它的一生中保持打開狀態。例如,如果您將它與'SimpleCursorAdapter'一起用於填充'ListView',那麼在ListView和SimpleCursorAdapter不再使用之前,您無法關閉「Cursor」。 – Squonk

+0

@Squonk感謝您的回答,併爲不提供logcat而表示歉意......用logcat編輯我的問題。請指教 – Siva

+0

這仍然不能解釋你如何使用'Cursor'。你表明你在調用一個'AsyncTask'而不是'AsyncTask'對檢索到的數據做什麼。 – Squonk

回答

0

你應該收於數據庫/光標連接儘快,這意味着一旦你拉從它的數據,你應該關閉的一切,讓你不鎖定數據庫。

持有到數據庫連接是不好的做法,特別是對多線程應用程序

+0

感謝您的回覆,但那是我的問題,當我在任何數據庫操作之後立即關閉時,它會向我拋出'空指針異常'。在我的問題,如果我關閉'新的popdailydata()。execute();'它給我例外 – Siva

+0

@tyczj:你的答案是不完全正確的。如果要使用'Adapter'和'AdapterView','Cursor'必須保持打開狀態。此外,如果您使用「SQLiteOpenHelper」,那麼明確關閉數據庫可能是有害的 - 請檢查源代碼。 – Squonk

+0

@Siva如果你得到null,意味着'Database.getInstance(getApplicationContext())。getWritableDatabase()'返回null。在開始asynctask後也立即關閉也不好,因爲應用程序不會暫停,直到異步任務完成,這將打敗asynctask的目的 – tyczj

1

有關Android的數據庫操作的整體操作,這裏是信息的重要來源,使用內容提供商: http://www.vogella.com/tutorials/AndroidSQLite/article.html

這裏是一個如何實現LoaderManager的例子。你可以在這裏找到各種實例:http://developer.android.com/reference/android/app/LoaderManager.html

對於基本實現的想法,這是應該的樣子:

public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> { 

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

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(this, 
      ObjectEntity.URI, // Database uri 
      new String[]{"id"}, // Columns to select 
      "id=?",    // 'where' field 
      new String[]{"3"}, // Values for 'where' '?' field 
      null); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    // Do anything you want here with the cursor 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 

} 

}

+0

感謝您的迴應......將通過鏈接。 – Siva