0

我正在从 SQLite 数据库填充一个列表视图,当我单击一个项目时应用程序崩溃。我已经使用“查询”和“原始查询”进行了足够的研究。在 SQLite 数据库浏览器中也成功执行了 rawquery 语句,但同样的语句在我的代码中仍然不起作用。

下面是我的列表视图 onitemclicklistener 的代码:

//  Bookmark ListView Listener
    bookmarkListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent1, View view1, int position1,
                long id1) {
            String selectedBookmarkItem = ((TextView)view1).getText().toString();

            dbAdapter.read();

            Map<String, Object> bookmarkKV = dbAdapter.getSingleBookmark(selectedBookmarkItem);
            String bookmarkedURL = (String) bookmarkKV.get(dbAdapter.BOOKMARK_ADDRESS);

            dbAdapter.close();
            Toast.makeText(getBaseContext(), bookmarkedURL, Toast.LENGTH_LONG).show();
}
});

方法 getSingleBookmark 代码:

//  Fetch Single Bookmark
public Map<String, Object> getSingleBookmark(String bookmarkName1) throws SQLException{
    Map<String, Object> map1 = new HashMap<String, Object>();
    Cursor cursor1 = db.query(true, BOOKMARKS_TABLE, new String[] {BOOKMARK_ADDRESS},
            BOOKMARK_NAME + "=" + bookmarkName1, null, null, null, null, null);

    if(cursor1 != null){
        cursor1.moveToFirst();
    }

    String bookmarkAddress = cursor1.getString(cursor1.getColumnIndex(BOOKMARK_ADDRESS));
    map1.put(BOOKMARK_ADDRESS, bookmarkAddress);
    //String bookmarkName = cursor1.getString(cursor1.getColumnIndex(BOOKMARK_NAME));
    //map1.put(BOOKMARK_NAME, bookmarkName);

    return map1;
}

LogCat 条目:

09-30 03:43:12.791: E/AndroidRuntime(29008): FATAL EXCEPTION: main
09-30 03:43:12.791: E/AndroidRuntime(29008): android.database.sqlite.SQLiteException:     
no such column: gmail (code 1): , while compiling: SELECT DISTINCT bookmarkaddress 
FROM bookmarkstable WHERE bookmarkname=gmail

当我单击列表视图中的“gmail”项目时,应用程序崩溃说“不幸的是,应用程序已停止”。

但是数据库表中有“gmail”条目的行:

在此处输入图像描述

4

2 回答 2

2

The key is in the error message:

no such column: gmail

you see the query that it's trying to run includes

WHERE bookmarkname=gmail

Your query needs to be modified to indicate that it's a string - in your cursor, change:

BOOKMARK_NAME + "=" + bookmarkName1

for:

BOOKMARK_NAME + "='" + bookmarkName1 + "'"

This will then put the value of "bookmarkName1" in single quote marks.

Selvin's edit: or even better, use parameters(using them will avoid future problems with strings containing '):

db.query(true, BOOKMARKS_TABLE, new String[] {BOOKMARK_ADDRESS},
                BOOKMARK_NAME + "=?", 
                new String[] { bookmarkName1 }, 
null, null, null, null);
于 2013-09-30T08:37:12.627 回答
0

始终在使用原始查询时,您必须用引号括起字符串,并在字符串中转义配额(替换'\')。

最好的方法是使用选择和选择参数,所以它是为您完成的:

mContext.getContentResolver().query(Model.CONTENT_URI, null, SELECTION,
                    new String[] { ARGUMENT }, null);

包含在哪里SELCTION?标志,例如:name=?

于 2013-09-30T09:09:42.547 回答