Android 游标和SimpleCursorAdapter

Android 游标和SimpleCursorAdapter,android,sqlite,simplecursoradapter,Android,Sqlite,Simplecursoradapter,可能重复: 我试图将数据库的值返回到listview,但遇到了一个错误。我使用游标从表中获取数据,使用SimpleCursorAdapter读取游标。这是执行此操作的方法: public void getData(){ String[] columns = new String[] {ModuleDB.KEY_ROWID, ModuleDB.KEY_MODCODE, ModuleDB.KEY_MODNAME,

可能重复:

我试图将数据库的值返回到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();
        }
此方法导致异常:
“onCreate()之前的活动无法使用系统服务”

有人能帮我吗?我找不到任何关于游标和游标适配器的好教程,我真的完全迷路了

编辑:

这可能会有帮助

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

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

        }
}
编辑2: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
11-06 23:24:07.885:D/AndroidRuntime(887):关闭虚拟机
11-06 23:24:07.885:W/dalvikvm(887):threadid=1:线程以未捕获异常退出(组=0x4001d800)
11-06 23:24:07.895:E/AndroidRuntime(887):致命异常:主
11-06 23:24:07.895:E/AndroidRuntime(887):java.lang.RuntimeException:无法启动活动组件信息{com.adoherty.assignment3/com.adoherty.assignment3.MainActivity}:
java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.os.Handler.dispatchMessage(Handler.java:99)上
11-06 23:24:07.895:E/AndroidRuntime(887):在android.os.Looper.loop(Looper.java:123)上
11-06 23:24:07.895:E/AndroidRuntime(887):位于android.app.ActivityThread.main(ActivityThread.java:4627)
11-06 23:24:07.895:E/AndroidRuntime(887):位于java.lang.reflect.Method.Invokenactive(本机方法)
11-06 23:24:07.895:E/AndroidRuntime(887):位于java.lang.reflect.Method.invoke(Method.java:521)
11-06 23:24:07.895:E/AndroidRuntime(887):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-06 23:24:07.895:E/AndroidRuntime(887):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-06 23:24:07.895:E/AndroidRuntime(887):在dalvik.system.NativeStart.main(本机方法)
11-06 23:24:07.895:E/AndroidRuntime(887):原因:java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.Activity.getSystemService(Activity.java:3526)上
11-06 23:24:07.895:E/AndroidRuntime(887):位于android.widget.ResourceCursorAdapter.(ResourceCursorAdapter.java:49)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.widget.SimpleCursorAdapter。(SimpleCursorAdapter.java:84)
11-06 23:24:07.895:E/AndroidRuntime(887):在com.adoherty.assignment3.ModuleDataSource.getData(ModuleDataSource.java:74)
11-06 23:24:07.895:E/AndroidRuntime(887):位于com.adoherty.assignment3.MainActivity.onCreate(MainActivity.java:17)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-06 23:24:07.895:E/AndroidRuntime(887):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-06 23:24:07.895:E/AndroidRuntime(887):。。。还有11个

您正在活动构造函数中执行某些操作,应该改为在onCreate()中执行


这可能与此问题相同:

您正在活动构造函数中执行某些操作,这些操作应该在onCreate()中完成


这可能与此问题相同:

模块化数据源扩展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);

        }
}

ModuleDataSource扩展了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);

        }
}

类似于将对
getData()
的调用移动到
onCreate()
时发生的问题?您无法执行以下操作。。。ModuleDataSource dbinfo=新ModuleDataSource(此);-您的
ModuleDasSource
扩展了
ListActivity
,您不能使用
new
创建任何类型的
活动的实例。此外,您决不能尝试从
活动本身内部以外的任何地方调用属于该
活动的方法或访问字段。类似于将对
getData()
的调用移动到
onCreate()
时发生的问题,您无法执行以下操作。。。ModuleDataSource dbinfo=新ModuleDataSource(此);-您的
ModuleDasSource
扩展了
ListActivity
,您不能使用
new
创建任何类型的
活动的实例。此外,决不能尝试调用属于