2014-03-06 65 views
-1

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

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 
     } 
    } 

} 
+0

试试这个'的String [] whereClause = {imageId.toString()};' –

+0

没有工作:( –

+0

或尝试按我的答案,但要确保你的id是不是空 –

回答

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

原来我是路过的id imageview,而不是imageview中的图像ID! –

+0

在尝试访问行数据之前,始终检查“moveTo ...”的返回值。 – laalto

0

查询看起来OK。您是否验证过存在具有指定DrawableReference的行?

在植根设备或模拟器您可以通过这样做:

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"))