2012-11-06 1 views
0

가능한 중복 :
System services not available to Activities before onCreate?커서와 SimpleCursorAdapter

나는 목록보기에 데이터베이스의 값을 반환하려고하지만 오류를 얻고있다. 커서를 사용하여 표에서 데이터를 가져오고 SimpleCursorAdapter를 사용하여 커서를 읽습니다. 이이 작업을 수행하는 방법입니다 : "System Services not available to activites before onCreate()"

이 가

이 사람이 나를 도울 수 :

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(); 
     } 

이 메소드는 예외를 일으키는? 나는 커서 및 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 : 로그 캣

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을 ... 일이되지

이런 식으로 뭔가 : 유사

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"로 바꿉니다. 나는 그것을 반영하기 위해 내 대답을 변경했습니다 ... 죄송합니다 ... 작은 감독 – dymmeh

+0

도움을 주셔서 감사합니다. – adohertyd

0

당신은 당신의 활동 생성자에서 일을하고, 즉 우 uld는 onCreate()에서 대신 수행됩니다.

그것은 아마 것과 같은 문제입니다 .. 당신은 당신 ListActivity가 그

같은 객체로 활동을 인스턴스화 할 수 없습니다 System services not available to Activities before onCreate?

+0

응답 해 주셔서 감사합니다. – adohertyd

+0

이제 코드 스 니펫을보고 dymmeh의 대답에 투표합니다. – forgemo