2013-10-10 28 views
-1

我想从数据库中提取联系人。在下面的代码中,当调用rawQuery()时,出现错误,说明当对象为db时,需要完成对象转换。我很困惑参数rawQuery()需要。请你能向我解释一下吗?错误的数据提取使用rawQuery

String select = "SELECT id, name FROM contacts WHERE email = " + email; 
Cursor c = db.rawQuery(select, null); 

回答

0
String select = "SELECT id, name FROM contacts WHERE email = " + email; 

在你的情况下,该代码将无法工作,因为你是直接添加参数查询,需要将它们包装成单引号(否则将无法正常工作和SQLite将解释值作为柱,异常将被抛出)。所以你需要改变它:

String select = "SELECT id, name FROM contacts WHERE email = '" + email + "'"; 

它现在应该工作。


但我不喜欢你的方法。这不是人类可读和危险的(SQL注入)。我强烈建议您使用参数化查询,这些查询更快,更安全,更易于人工读取。

例子:

String select = "SELECT id, name FROM contacts WHERE email = ?"; 
String[] whereArgs = {email}; 
Cursor c = db.rawQuery(select, whereArgs); 

希望它能帮助。

注意:也请确保您已正确初始化SQLiteDatabase实例。

+0

我使用的第二approach.Thank你的建议。在rawQuery中仍然显示一个错误,它表示在DBAdapter中创建createQuery方法。你能解释给我吗?我是新来的机器人,这是相当混乱! – user2761022

+0

@ user2761022 [rawQuery()](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html)是方法SQLiteDatabase实例,而不是您自定义实现的DBAdapter。所以你需要在你的SQLiteDatabase实例上调用rawQuery。 – Sajmon

+0

db = DBHelper.getWritableDatabase(); 我在DBAdapter中完成了。并在活动中我已经将它实例化为DBAdapter db = new DBAdapter(this);仍然,为什么是错误信息? – user2761022

0

试试这个

Cursor cursor = dh.rawQuery("SELECT _id ,name FROM contacts WHERE email LIKE ? ", new String[] {"%"});