带有WHERE子句的Android SQLiteDatabase查询

时间:2014-03-06 06:28:38

标签: android sqlite

我有一个名为"数据库"的SQLiteDatabase。在其中有一个名为" Pics"的表。在表中有三列如下,DrawableName TEXT,DrawableReference INTEGER,PictureRating REAL。我想用我期望在DrawableReference列中的整数查询我的数据库。我想这样做,以便我可以从同一行获得相应的DrawableName和PictureRating。我的查询出了什么问题?

public class EditItemActivity extends Activity {
    EditText textField=null;
    RatingBar ratingBar=null;
    SQLiteDatabase db=null;
    Cursor dbCursor=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent=getIntent();
        Integer imageId=intent.getIntExtra("imageId",-1);
        if(imageId==-1){
            return;
        }
        String id=imageId.toString(); //not used right now
        setContentView(R.layout.edit_item_layout);
        db=this.openOrCreateDatabase("Database",this.MODE_PRIVATE,null);
        String selection="DrawableReference = ?";
        String[] whereClause={id.toString()};
        dbCursor=db.query("Pics",null,selection,whereClause,null,null,null);//get the row where the correct DrawableReference integer is found
        textField=(EditText)findViewById(R.id.title);
        ratingBar=(RatingBar)findViewById(R.id.image_rating_bar);
        if(dbCursor.moveToFirst()){
            textField.setText(dbCursor.getString(0)); //this never happens
        }
    }

}

2 个答案:

答案 0 :(得分:3)

尝试这种方式:

    Cursor dbCursor = db.rawQuery("SELECT DrawableName,PictureRating FROM Pics Where DrawableReference='"+ id.toString()+"'", null);

    if(dbCursor.moveToFirst()) {
    textField.setText(dbCursor.getString(0)); 
    }

Cursor cursor = db.query("Pics", new String[] { "DrawableName",
        "PictureRating" }, "DrawableReference =?",
        new String[] {id}, null, null, null, null);
if (cursor.moveToFirst())
  textField.setText(cursor.getString(0)); 
}

答案 1 :(得分:0)

查询看起来不错。您是否确认存在指定DrawableReference的行?

在root设备或模拟器上,您可以执行以下操作:

adb shell
su
cd /data/data/com.your.package/databases
sqlite3 your_db_name.db

然后进行常规SQL查询。

您还应避免在Cursor.getFoo()调用中使用常量列索引。据我所知,当前实现以与投影中指定的顺序相同的顺序返回列。或者在投影为空时按CREATE TABLE语句中的列定义顺序排列,但API无法保证这一点。您应该使用cursor.getString(cursor.getColumnIndexOrThrow("column_name"))代替。