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 的查询?

SQLite 入门到精通

如何在 Android 应用程序中执行 SQLite 查询?

Android SQLite:哪个查询(“query”或“rawQuery”)更快?

SQLite3-我怎样才能加快这个 SELECT 查询?