2012-11-06 43 views
0

可能重複:
System services not available to Activities before onCreate?光標和SimpleCursorAdapter

我試圖數據庫的值返回到ListView但我得到一個錯誤。我正在使用遊標從表中獲取數據,並使用SimpleCursorAdapter讀取遊標。這是做這個的方法:

public void getData(){ 
     String[] columns = new String[] {ModuleDB.KEY_ROWID, 
       ModuleDB.KEY_MODCODE, 
       ModuleDB.KEY_MODNAME, 
       ModuleDB.KEY_LECPRAC, 
       ModuleDB.KEY_DAYS, 
       ModuleDB.KEY_TIMESTART, 
       ModuleDB.KEY_TIMEEND, 
       ModuleDB.KEY_LOCATION, 
       ModuleDB.KEY_INFO}; 
     int[] to = new int[]{R.id.modcode_entry, 
          R.id.modname_entry, 
          R.id.modlecprac_entry, 
          R.id.modday_entry, 
          R.id.modtimestart_entry, 
          R.id.modtimeend_entry, 
          R.id.modlocation_entry, 
          R.id.modaddinfo_entry}; 

     Cursor curs = myDatabase.query(ModuleDB.DB_TABLE, columns, null, null, null, null, null); 
     if (curs != null) 
      curs.moveToFirst(); 

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(ModuleDataSource.this, R.layout.list_entry, curs, columns, to); 
     this.setListAdapter(dataSource); 

     // Make sure to close the cursor 
     curs.close(); 
     } 

這種方法導致了異常:"System Services not available to activites before onCreate()"

誰能幫助我?我找不到光標和cursoradapters任何好的教程,我真的很徹底失去

編輯:

這可能會有幫助。

MainActivity.java

public class MainActivity extends Activity { 

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

     ModuleDataSource dbinfo = new ModuleDataSource(this); 
     dbinfo.open(); 
     dbinfo.getData(); 
     dbinfo.close(); 
    } 

ModuleDataSource.java

public class ModuleDataSource extends ListActivity{ 

    private SQLiteDatabase myDatabase; 
    private ModuleDB myhelper; 

    public ModuleDataSource(Context context){ 
     myhelper = new ModuleDB(context); 
    } 

    public void open() throws SQLException { //Open the database for writing 
     myDatabase = myhelper.getWritableDatabase(); 
    } 

    public void close(){ //Close the database 
     myhelper.close(); 
    } 

    public void getData(){ 
     String[] columns = new String[] {ModuleDB.KEY_ROWID, 
       ModuleDB.KEY_MODCODE, 
       ModuleDB.KEY_MODNAME, 
       ModuleDB.KEY_LECPRAC, 
       ModuleDB.KEY_DAYS, 
       ModuleDB.KEY_TIMESTART, 
       ModuleDB.KEY_TIMEEND, 
       ModuleDB.KEY_LOCATION, 
       ModuleDB.KEY_INFO}; 
     int[] to = new int[]{R.id.modcode_entry, 
          R.id.modname_entry, 
          R.id.modlecprac_entry, 
          R.id.modday_entry, 
          R.id.modtimestart_entry, 
          R.id.modtimeend_entry, 
          R.id.modlocation_entry, 
          R.id.modaddinfo_entry}; 

     Cursor curs = myDatabase.query(ModuleDB.DB_TABLE, columns, null, null, null, null, null); 
     startManagingCursor(curs); 

     if (curs != null) 
      curs.moveToFirst(); 

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(ModuleDataSource.this, R.layout.list_entry, curs, columns, to); 
     setListAdapter(dataSource); 

     } 
} 

EDIT2:logcat的

11-06 23:24:07.885: D/AndroidRuntime(887): Shutting down VM 
11-06 23:24:07.885: W/dalvikvm(887): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
11-06 23:24:07.895: E/AndroidRuntime(887): FATAL EXCEPTION: main 
11-06 23:24:07.895: E/AndroidRuntime(887): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adoherty.assignment3/com.adoherty.assignment3.MainActivity}: 
              java.lang.IllegalStateException: System services not available to Activities before onCreate() 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.os.Looper.loop(Looper.java:123) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-06 23:24:07.895: E/AndroidRuntime(887): at java.lang.reflect.Method.invokeNative(Native Method) 
11-06 23:24:07.895: E/AndroidRuntime(887): at java.lang.reflect.Method.invoke(Method.java:521) 
11-06 23:24:07.895: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-06 23:24:07.895: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-06 23:24:07.895: E/AndroidRuntime(887): at dalvik.system.NativeStart.main(Native Method) 
11-06 23:24:07.895: E/AndroidRuntime(887): Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate() 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.Activity.getSystemService(Activity.java:3526) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:49) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:84) 
11-06 23:24:07.895: E/AndroidRuntime(887): at com.adoherty.assignment3.ModuleDataSource.getData(ModuleDataSource.java:74) 
11-06 23:24:07.895: E/AndroidRuntime(887): at com.adoherty.assignment3.MainActivity.onCreate(MainActivity.java:17) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-06 23:24:07.895: E/AndroidRuntime(887): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
11-06 23:24:07.895: E/AndroidRuntime(887): ... 11 more 
+0

類似的質疑http://stackoverflow.com/questions/5905587/system-services-not-available-to-activities-before-oncreate –

+0

當您移動調用會發生什麼' getData()'到'onCreate()'? – Sam

+2

您無法執行以下操作... ** ModuleDataSource dbinfo = new ModuleDataSource(this); ** - 您的'ModuleDataSource'擴展了'ListActivity',並且您無法使用'new'創建任何類型的'Activity'的實例。此外,您絕不能嘗試從除「Activity」本身之外的任何地方調用方法或訪問屬於「Activity」的字段。 – Squonk

回答

5

ModuleDataSource extends ListActivity ..你是你的活動中創造者的一個實例。你不能實例化一個活動作爲像

你ListActivity是一個對象可能會嘗試進行一些系統調用,通常會自動爲您進行後臺調用。既然你試圖實例化一個ListActivity爲對象,正常的活動過程中沒有發生......

你應該將你所擁有的在ListActivity到您的主要活動,讓您的主要活動的ListActivity

事情是這樣的:

public class MainActivity extends ListActivity { 

    private SQLiteDatabase myDatabase; 
    private ModuleDB myhelper; 

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

     myhelper = new ModuleDB(this); 
     open(); 
     getData(); 
     close(); 
    } 

    public void open() throws SQLException { //Open the database for writing 
     myDatabase = myhelper.getWritableDatabase(); 
    } 

    public void close(){ //Close the database 
     myhelper.close(); 
    } 

    public void getData(){ 
     String[] columns = new String[] {ModuleDB.KEY_ROWID, 
       ModuleDB.KEY_MODCODE, 
       ModuleDB.KEY_MODNAME, 
       ModuleDB.KEY_LECPRAC, 
       ModuleDB.KEY_DAYS, 
       ModuleDB.KEY_TIMESTART, 
       ModuleDB.KEY_TIMEEND, 
       ModuleDB.KEY_LOCATION, 
       ModuleDB.KEY_INFO}; 
     int[] to = new int[]{R.id.modcode_entry, 
          R.id.modname_entry, 
          R.id.modlecprac_entry, 
          R.id.modday_entry, 
          R.id.modtimestart_entry, 
          R.id.modtimeend_entry, 
          R.id.modlocation_entry, 
          R.id.modaddinfo_entry}; 

     Cursor curs = myDatabase.query(ModuleDB.DB_TABLE, columns, null, null, null, null, null); 
     startManagingCursor(curs); 

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(ModuleDataSource.this, R.layout.list_entry, curs, columns, to); 
     setListAdapter(dataSource); 

     } 
} 
+0

非常感謝。我明白你的意思,我沒有看到那個錯誤。只是一件小事:在聲明'myhelper = newModuleDB(context)'時,我該如何處理上下文,因爲我不再在構造函數中聲明它了? – adohertyd

+0

用「this」替換「context」..我改變了我的答案以反映那..對不起..小監督 – dymmeh

+0

感謝非常讚賞的幫助 – adohertyd