【问题标题】:Android SQLite Query安卓 SQLite 查询
【发布时间】:2015-04-08 03:59:41
【问题描述】:

所以我在表中插入信息没有任何问题,但是当我尝试查询我的数据库时,我似乎在检索它时遇到了问题。我一般是 SQLite 和数据库的新手,所以我的理解可能不同。以下是我的常量的声明:

    public static abstract class TableInfo implements BaseColumns
{
    //User Table
    public static final String USER_NAME = "user_name";
    public static final String USER_PASS = "user_pass";
    public static final String USER_FNAME = "user_fname";
    public static final String USER_LNAME = "user_lname";
    public static final String DATABASE_NAME = "current_users";
    public static final String USER_TABLE = "user_info";

    //Message Table
    public static final String MESSAGE_ID = "msg_id";
    public static final String RECEIVER_ID = "receiver_id";
    public static final String SENDER_ID = "sender_id";
    public static final String MESSAGE = "message";
    public static final String STATUS = "status";
    public static final String MSG_TABLE = "msg_info";

这是我创建表的查询字符串(有效)

 public String CREATE_MSG_TABLE = "CREATE TABLE " + TableData.TableInfo.MSG_TABLE +
        " ( " + TableData.TableInfo.MESSAGE_ID + " INTEGER PRIMARY KEY, "
        + TableData.TableInfo.RECEIVER_ID + " TEXT, "
        + TableData.TableInfo.SENDER_ID + " TEXT, "
        + TableData.TableInfo.MESSAGE + " TEXT, "
        + TableData.TableInfo.STATUS + " INTEGER);";
 public void onCreate(SQLiteDatabase sdb){
    sdb.execSQL(CREATE_USER_TABLE);
    Log.d("Database operations", "Table1 created");
    sdb.execSQL(CREATE_MSG_TABLE);
    Log.d("Database operations", "Table2 created");

}

这是我用来查询数据库以获取我的信息的方法。它是一个消息传递应用程序,所以我想要接收者 ID 和消息:

public Cursor getInformationMsgTable(DatabaseOperations dop) {
    SQLiteDatabase SQ = dop.getWritableDatabase();

    Cursor CR = SQ.rawQuery("SELECT "
            +  TableData.TableInfo.RECEIVER_ID + ","
            +  TableData.TableInfo.SENDER_ID + ","
            +  TableData.TableInfo.MESSAGE + ","
            +  TableData.TableInfo.STATUS
            + " FROM " + TableData.TableInfo.MSG_TABLE,null);
    return CR;
}

最后,当我用光标返回时,我会这样做:

 private void loadMessages()
    {
    DatabaseOperations DOP = new DatabaseOperations(CTX);
    //The cursor will iterate through the DB
    Cursor CR = DOP.getInformationMsgTable(DOP);
    if(CR.getCount() > 0)
    {
        CR.moveToFirst();

        String[] fromFieldNames = new String[]
            {
                    TableData.TableInfo.RECEIVER_ID,
                    TableData.TableInfo.MESSAGE
            };
        int[] toViewIDs = new int[]
            {
                    R.id.userNameFromDB,
                    R.id.messageInfoDB
            };
        SimpleCursorAdapter myCursorAdapter;
        myCursorAdapter = new SimpleCursorAdapter(
                CTX,
                R.layout.item_layout,
                CR,
                fromFieldNames,
                toViewIDs);
        ListView myList = (ListView) findViewById(R.id.friendsLV);
        myList.setAdapter(myCursorAdapter);
    }
}

我在表中插入了多行,每次我都会记录。但我得到的错误是“java.lang.IllegalArgumentException:列'_id'不存在”,它指的是receiver_id列。有什么想法吗?我觉得奇怪的是它会删除“_”之前的部分。此外,当表为空时,我可以使用加载消息功能并且没有任何问题,但是当我向表中添加一行然后查询表时,我会遇到问题和错误。谢谢。编辑:我复制了错误的功能,现在已更正。

请求的跟踪: 04-07 23:14:57.850 32315-32315/com.example.andy.justalk D/AndroidRuntime: 关闭虚拟机 04-07 23:14:57.852 32315-32315/com.example.andy.justalk E/AndroidRuntime:致命异常:主要 进程:com.example.andy.justtalk,PID:32315 java.lang.IllegalArgumentException:列“_id”不存在 在 android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303) 在 android.widget.CursorAdapter.init(CursorAdapter.java:172) 在 android.widget.CursorAdapter.(CursorAdapter.java:120) 在 android.widget.ResourceCursorAdapter.(ResourceCursorAdapter.java:52) 在 android.widget.SimpleCursorAdapter.(SimpleCursorAdapter.java:78) 在 com.example.andy.justtalk.FriendsList.loadMessages(FriendsList.java:72) 在 com.example.andy.justtalk.FriendsList.access$000(FriendsList.java:17) 在 com.example.andy.justtalk.FriendsList$1.onClick(FriendsList.java:35) 在 android.view.View.performClick(View.java:4780) 在 android.view.View$PerformClick.run(View.java:19866) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

  • 您能否发布有关此错误的完整 logcat 跟踪信息?
  • 我没有丰富的 SQLite 经验,但在您选择的末尾没有看到 ;。
  • 不幸的是,这并没有什么不同@smskelley

标签: java android mysql sqlite


【解决方案1】:

您可以根据需要创建和定义表格,但如果您必须通过 CursorAdapter 使用表格,那么如果不进行调整就无法工作。

CursorAdapter:Cursor 必须包含名为“_id”的列,否则此类将不起作用。

您必须始终发出 select col1 as _id ... 才能工作。

所以建议在表模式中使用_id。

【讨论】:

  • 我认为这也是问题所在,但我有一个名为 msg_id 的列,它是一个整数主键。我刚才将它包含在我的查询中,但我仍然收到错误,这是您的意思吗?
  • 不。您必须有一个带有“_id”名称的列名,或者您可以在选择查询中进行一些更改。你能发给我选择查询吗?
  • 光标 CR = SQ.rawQuery("SELECT " + TableData.TableInfo.RECEIVER_ID + "," + TableData.TableInfo.SENDER_ID + "," + TableData.TableInfo.MESSAGE + "," + TableData .TableInfo.STATUS + " FROM " + TableData.TableInfo.MSG_TABLE,null);
  • 光标 CR = SQ.rawQuery("SELECT " + TableData.TableInfo.MESSAGE_ID +" AS _id, " + TableData.TableInfo.RECEIVER_ID + "," + TableData.TableInfo.SENDER_ID + "," + TableData.TableInfo.MESSAGE + "," + TableData.TableInfo.STATUS + " FROM " + TableData.TableInfo.MSG_TABLE,null);
  • 非常感谢,我刚刚把msg_id的列名改成了_id。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多