Android SQLite SELECT 查询
Posted
技术标签:
【中文标题】Android SQLite SELECT 查询【英文标题】:Android SQLite SELECT Query 【发布时间】:2012-03-06 01:05:37 【问题描述】:我从EditText
中获取String
值并将其设置在SELECT QUERY after WHERE
条件中
作为
TextView tv = (TextView) findViewById(R.id.textView3);
EditTextet2 et = (EditText) findViewById(R.id.editText1);
String name = et.getText().toString();
Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE name = '"+name+"'", null);
c.moveToNext();
tv.setText(c.getString(c.getColumnIndex("email")));
但它不起作用。有什么建议?
【问题讨论】:
打印姓名并确保您获得的姓名有效。使用 c.moveToFirst();而不是 C....next() 并尝试。 【参考方案1】:尝试修剪字符串以确保没有多余的空格:
Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE TRIM(name) = '"+name.trim()+"'", null);
也可以使用c.moveToFirst()
,就像提到的@thinksteep。
【讨论】:
这个例子很糟糕,允许 SQL 注入。为什么不正确使用第二个参数而不是插入null?【参考方案2】:这是选择语句的完整代码。
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT column1,column2,column3 FROM table ", null);
if (c.moveToFirst())
do
// Passing values
String column1 = c.getString(0);
String column2 = c.getString(1);
String column3 = c.getString(2);
// Do something Here with values
while(c.moveToNext());
c.close();
db.close();
【讨论】:
请注意,使用 c.getString(c.getColumnIndex("column1")) 比使用 c.getString(0) 更好:如果您更改查询,则不必更新索引。 我也会转义名称参数以避免 SQL 注入【参考方案3】:尝试使用以下语句:
Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE name = ?", new String[] name);
android 要求 WHERE 子句与 ? 进行比较,然后您指定相等数量的 ?在查询的第二个参数中(您当前有 null)。
正如 Nambari 所说,您应该使用 c.moveToFirst()
而不是 c.moveToNext()
另外,名字中可以引用吗?这也可能把事情搞砸。
【讨论】:
【参考方案4】:这是下面的代码。
String areaTyp = "SELECT " +AREA_TYPE + " FROM "
+ AREA_TYPE_TABLE + " where `" + TYPE + "`="
+ id;
其中 id 是显示结果的条件。
【讨论】:
这有一个 SQL 注入问题【参考方案5】: public User searchUser(String name)
User u = new User();
SQLiteDatabase db = this.getWritableDatabase(); //get the database that was created in this instance
Cursor c = db.rawQuery("select * from " + TABLE_NAME_User+" where username =?", new String[]name);
if (c.moveToLast())
u.setUsername(c.getString(1));
u.setEmail(c.getString(1));
u.setImgUrl(c.getString(2));
u.setScoreEng(c.getString(3));
u.setScoreFr(c.getString(4));
u.setScoreSpan(c.getString(5));
u.setScoreGer(c.getString(6));
u.setLevelFr(c.getString(7));
u.setLevelEng(c.getString(8));
u.setLevelSpan(c.getString(9));
u.setLevelGer(c.getString(10));
return u;
else
Log.e("error not found", "user can't be found or database empty");
return u;
这是我选择一个用户且仅一个用户的代码 所以你启动你的类的一个空对象然后 你调用你的可写数据库 使用光标以防万一你需要一个 在这里你可以选择使用:1-
if (c.moveToLast()) //it return the last element in that cursor
或使用:2-
if(c.moveToFirst()) //return the first object in the cursor
不要忘记,如果数据库是空的,你必须处理这个问题,在我的情况下,我只返回一个空对象
祝你好运
【讨论】:
【参考方案6】:详细回答:
String[] selectionArgs = new String[]name;
Cursor c = db.rawQuery(
"SELECT * FROM " + tabl1 +
" WHERE " + name + " = ? ", selectionArgs
);
selectionArgs :这将您希望与之比较的'name'
作为参数。
这里注意“一个Cursor对象,它位于你引用的表格的第一个条目之前”。
所以,移动到第一个条目:
c.moveToFirst();
getColumnIndex(String ColumnName) :这将返回给定列名的从零开始的列索引。
tv.setText(c.getString(c.getColumnIndex("email")));
如果您想在“名称”列下搜索给定名称的多行,然后使用如下循环:
if (cursor.moveToFirst())
do
////go traversing through loops
while(cursor.moveToNext());
这应该可以解决问题。
【讨论】:
以上是关于Android SQLite SELECT 查询的主要内容,如果未能解决你的问题,请参考以下文章
android.database.sqlite.SQLiteException:靠近“*”:语法错误:,编译时:SELECT调用._id
如何找出在 Android 中发送到 SQLite 的查询?
如何在 Android 应用程序中执行 SQLite 查询?