【问题标题】:What is wrong with my query我的查询有什么问题
【发布时间】:2013-11-24 15:47:10
【问题描述】:

我正在尝试使用 CursorLoader 查询数据库

这是来自加载器的查询

11-24 17:33:21.507:E/ACRA(32418):由以下原因引起: android.database.sqlite.SQLiteException: near ")": 语法错误(代码 1): , 编译时: SELECT _id, contact_id, photo_uri, data1, 从 view_data 数据 WHERE (1) AND (( (mimetype=? OR mimetype=?) AND data1 like ?%)) ORDER BY lookup

我看不到的“)”附近有什么问题? - 这就是为什么我的查询参数看起来像

Uri AUTO_COMPLETE_CONTACT_URI = Data.CONTENT_URI;

String[] AUTO_COMLETE_PROJECTION = {Data._ID, Data.CONTACT_ID, Data.PHOTO_URI,   Data.DATA1 ,Data.LOOKUP_KEY};
String AUTO_COMPLETE_SELECTION_LIKE_QUERY = AUTO_COMPLETE_SELECTION + " AND " + Data.DATA1 + " like ?";

public static String[] getAutoCompleteQuerySelectionArgs(String query) {
    return new String[] { Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE, query+"%" };
}

/** This method is invoked by initLoader() */
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle data) {
    switch(id) {
    case ContactsQuery.AUTO_COMPLETE_QUERY_ID:
        Uri uri = ContactsQuery.AUTO_COMPLETE_CONTACT_URI;  
        if(data!=null) {
        String query = data.getString(ContactsQuery.AUTO_COMPLETE_QUERY);
        return new CursorLoader(getActivity().getBaseContext(), uri, ContactsQuery.AUTO_COMLETE_PROJECTION, ContactsQuery.AUTO_COMPLETE_SELECTION_LIKE_QUERY , Query.getAutoCompleteQuerySelectionArgs(query), ContactsQuery.AUTO_COMPLETE_SORT_ORDER); 
        }else {
            return  new CursorLoader(getActivity().getBaseContext(), uri, ContactsQuery.AUTO_COMLETE_PROJECTION, ContactsQuery.AUTO_COMPLETE_SELECTION , null, ContactsQuery.AUTO_COMPLETE_SORT_ORDER);
        }
    }
return null;
}

/** This method is executed in ui thread, after onCreateLoader() */
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor c) { 
    chipsCursorAdapter.swapCursor(c);       
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    chipsCursorAdapter.swapCursor(null);
}

【问题讨论】:

  • FROM view_data 数据检查应该只有表名
  • 如果不尝试代码,我会说,问题在于您的 like 部分查询 - 您应该在 like 的右侧有 ' .一个例子data1 like '?%'。你试过了吗?
  • @Arju 完全没有必要,但FROM 是正确的:你可以使用FROM table-name table-alias

标签: android sqlite


【解决方案1】:

您的 LIKE 模式没有使用正确的 SQL 语法。

% 必须在字符串内部(即引号内),但 ? 必须在外部,因此您必须将它们连接起来:

... AND data1 LIKE ? || '%')) ORDER BY ...

【讨论】:

  • 此外,正如上面的评论者所指出的,from 子句格式不正确。
  • @EricTobias 绝对没有必要,但FROM 是正确的:你可以使用FROM table-name table-alias
  • 确实是这样,我需要查询 + "%" 才能正常工作
  • @LS_dev 虽然你是对的并且语法被接受,但我认为它是正确的,因为它符合 ISO 规范。我引用: AS 子句是 ISO 标准中定义的用于为结果集列分配名称的语法。这是在 SQL Server 2005 中使用的首选语法。来自msdn.microsoft.com/en-us/library/ms179300.aspx。虽然我知道他们指的是 SELECT 而不是 FROM 语句,但我认为一致性是关键,编写良好的代码比语法快捷方式更重要!
  • @EricTobias 我本人总是使用AS 来提高可读性。但是,您应用的“格式错误”是不正确的,因为使用的语法是绝对合法的。
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 2010-12-23
  • 2010-11-26
  • 2017-02-25
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多