我正在从SQLite数据库填充listview,当我点击某个项目时应用程序崩溃了。我已经使用“query”和“rawquery”做了足够的研究。还在SQLite数据库浏览器中成功执行了rawquery语句,但仍然在我的代码中使用相同的语句。
以下是我的listview 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
当我点击listview中的“gmail”项目时,该应用程序崩溃说“不幸的是,应用程序已停止”。
但数据库表的行包含“gmail”条目:
答案 0 :(得分:2)
密钥在错误消息中:
no such column: gmail
您会看到它尝试运行的查询包含
WHERE bookmarkname=gmail
您的查询需要修改以指示它是一个字符串 - 在您的光标中,更改:
BOOKMARK_NAME + "=" + bookmarkName1
有:
BOOKMARK_NAME + "='" + bookmarkName1 + "'"
然后将“bookmarkName1”的值放在单引号中。
Selvin的编辑:甚至更好,使用参数(使用它们将避免包含'
的字符串的未来问题):
db.query(true, BOOKMARKS_TABLE, new String[] {BOOKMARK_ADDRESS},
BOOKMARK_NAME + "=?",
new String[] { bookmarkName1 },
null, null, null, null);
答案 1 :(得分:0)
您的应用可能正在使用旧版本的数据库。尝试清除您的应用数据并重新运行您的程序。
希望这有帮助
答案 2 :(得分:0)
在使用原始查询时,您必须使用引号括起字符串,并在字符串中转义配额(将'
替换为\'
)。
最好的方法是使用选择和选择参数,这样就完成了:
mContext.getContentResolver().query(Model.CONTENT_URI, null, SELECTION,
new String[] { ARGUMENT }, null);
SELCTION
包含的位置?标志,例如:name=?