0

SQLite データベースからリストビューを作成していますが、項目をクリックするとアプリがクラッシュします。「query」と「rawquery」を使用して十分な調査を行いました。また、SQLite Database Browser で 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

キーはエラーメッセージにあります:

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);
于 2013-09-30T08:37:12.627 に答える