【问题标题】:How to create a list view contains data from sqlite in android如何在android中创建一个包含来自sqlite的数据的列表视图
【发布时间】:2015-05-05 12:31:46
【问题描述】:

我正在尝试在ListView 中显示来自 SQLite 数据库的数据。我使用CursorAdapterCursor 直接插入ListView,但由于某种原因,我总是遇到异常。 这是我修改后的 DBadapter 活动:

public static final String ID="_id";

    public Cursor feching_Data(){

            String[] columns = {ID,USER_NAME,USER_PASSWORD};
            db = dbHelper.getWritableDatabase();
            Cursor cursor = db.query(TABLE_NAME, columns,null,null,null,null,null);
            return cursor;

        }

这里我设置SimpleCursorAdapter:

public static final String ID="_id";
    String[] from = {logindatabase_adapter.USER_NAME,logindatabase_adapter.USER_PASSWORD};
    int[] to = {R.id.txt_username,R.id.txt_pasword};
    Cursor cursor = logindatabase_adapter.feching_Data();
    cursoradapter = new SimpleCursorAdapter(DatabaseListView.this, R.layout.listcell, cursor, from, to);
    database_results.setAdapter(cursoradapter);

这是我得到的例外:

FATAL EXCEPTION: main
   Process: com.developer.milanandroid, PID: 5109
   java.lang.IllegalArgumentException: column '_id' does not exist
    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
    at android.widget.CursorAdapter.init(CursorAdapter.java:172)
    at android.widget.CursorAdapter.<init>(CursorAdapter.java:120)
    at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
    at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
    at com.developer.milanandroid.DatabaseListView$1.onClick(DatabaseListView.java:50)
    at android.view.View.performClick(View.java:4438)
    at android.view.View.onKeyUp(View.java:8241)
    at android.widget.TextView.onKeyUp(TextView.java:5682)
    at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
    at android.view.View.dispatchKeyEvent(View.java:7665)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2035)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1505)
    at android.app.Activity.dispatchKeyEvent(Activity.java:2418)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
    at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
    at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
    at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:138)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android sqlite android-cursoradapter


    【解决方案1】:

    看看logcat,第二行就说明了错误的来源:

    java.lang.IllegalArgumentException: column '_id' does not exist.
    

    您的表没有_id 列,但CursorAdapter 要求存在_id 列(如文档right here 中所述)。


    您的解决方案很简单:您已经有一个 id 列,但它被称为ID。将其重命名为_id,一切正常!

    请注意,您可能必须重新安装应用才能使对列和/或表格的更改生效!

    【讨论】:

    • 我将我的 ID 替换为 _id 但它不起作用伙计。再次发生同样的情况请帮助我伙计@Xaver Kapeller
    • 您是否重新安装了该应用程序?重新安装是指从设备上完全卸载它,然后再次部署?
    • 不,伙计,我刚刚再次部署了它,只是我会通过卸载来检查它
    • 你确定是同一个错误吗?你确定你真的修好了?
    • 我可以向您保证,如果该表有一个 _id 列,那么它将起作用。你一定做错了什么。重新检查您的实施。
    【解决方案2】:

    不是重命名为_id,另一种方法是,在查询中你可以选择ID作为_id

    已经在 SO 中回答了。

    1. Android: column '_id' does not exist
    2. Android column '_id' does not exist?
    3. About “_id” field in Android SQLite

    【讨论】:

    • 如果你写一个答案,它必须是完全独立的。现在在上下文中,文本“而不是重命名为_id...”是有道理的,但是寻找问题答案的人不会理解这一点。他们只会想“重命名什么?”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多