2013-09-30 39 views
0

我从SQLite数据库填充listview,并且当我点击一个项目时应用程序崩溃。我用“查询”和“原始查询”做了足够的研究。在SQLite数据库浏览器中也成功执行了rawquery语句,但仍然是相同的语句在我的代码中不起作用。SQLite查询执行崩溃Android应用程序

下面是我的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 

当我点击在 “Gmail的” 项目listview,该应用程序崩溃说:“不幸的是,应用程序已停止”。

但数据库表中有一行“Gmail的”条目:

enter image description here

+0

看看这个查询,它看起来像Gmail应该有单引号,例如, 'SELECT DISTINCT bookmarkaddress FROM bookmarkstable WHERE bookmarkname ='gmail'' –

+0

每当有东西崩溃,就会产生一个异常。您可以将这些数据写入日志文件并查看:) –

+0

您可以发布您的数据库类的onCreate方法代码吗? –

回答

2

的关键是错误消息:

no such column: gmail 

你看到它试图运行查询包括

WHERE bookmarkname=gmail 

您的查询需要修改为indi美食,这是一个字符串 - 在你的光标,更改:

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

总之,它必须是'WHERE bookmarkname ='gmail''。 SQL中的所有字符串必须用单引号括起来:) –

+1

Lol感谢您清除那个;) – EvilGeniusJamie

+0

很高兴我能帮忙! –

0

可能是你的应用程序使用旧版本的分贝。尝试清除您的应用程序数据并再次运行您的程序。

希望使用原始查询则必须用引号字符串,也逃避你的字符串配额总是在这有助于

0

(更换'\')。

最好的办法是使用的选择和选择的参数,所以它是为你做:

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

哪里SELCTION包含?迹象,例如:name=?