2011-04-24 121 views
1

问题我有一个数据库,其中包含一个动物表,其中包含_id,name,biography的列。Android:与SQLite查询

我想根据用户选择的动物(从列表中)查询特定传记的数据库,问题是游标只会返回数据库中的第一个传记,或根本没有。

任何人都可以看到问题可能是什么,或提供一些有用的建议,我会非常感激。

// Code for obtaining position 
protected void onListItemClick(ListView l, View v, int position, long id){ 
     Intent animalIntent = new Intent(this, Animal.class); 
     animalIntent.putExtra("pos", position); 
     startActivity(animalIntent);  
    } 

//查询数据库中的bio,其中KEY_ROWID是通过列表中项目的“位置”查询的。 myCursor = dbm.getBio(position);

if(myCursor.moveToFirst()){ 

    // querying the cusor, retrieve in index of column BIOGRAPHY, store as column index. 
     int bio_index = myCursor.getColumnIndexOrThrow(MyDBManager.KEY_BIOGRAPHY); 

     // return the string from the cursor @ column index 
    String bio = myCursor.getString(bio_index); 

    // find textview 
     animalBio = (TextView)findViewById(R.id.bio); 

     // Set textView to value of string returned from myCursor @ bio_index 
    animalBio.setText(bio); 
    } 

//该方法总是返回

return qmDB.query(ANIMAL_TABLE, new String[]{ 
      KEY_ROWID, 
      KEY_BIOGRAPHY, 
      }, 
      KEY_ROWID, 
      null, 
      null, 
      null, 
      null); 
} 

存储在数据库中存储的 公共光标getBio(INT位置)中的数据库的基础资料的第一个值{I已经尝试其它变化如KEY_ROWID =“+”= position,KEY_ROWID =“?”,将位置转换为字符串,传入位置为long类型,硬编码数字等。

所以,你看到我感觉问题在于查询语句,它根本不会返回任何其他比第一行还是IF,它不显示!

SOLUTION:

记得在应用程序上更新您的数据库。

+0

你能否提供获取'position'的代码? – pecka85 2011-04-25 11:06:11

+0

肯定pecka,我已经更新了与代码原来的职位,还有一些关于我如何解决问题的新解释。 – Jnanathan 2011-04-25 13:41:24

+0

我已经设法解决了这个问题,因为事实证明我没有更新DB.4天和无数小时的沮丧感,不会忘记这一点,感谢大家提供有用的建议。 – Jnanathan 2011-04-25 14:27:41

回答

0

和JDBC结果集一样,您需要调用'moveToNext()'方法来移动光标。例如:

while(myCursor.moveToNext()){ 
    bio = myCursor.getString(bio_index); 
    // etc... 
} 

光标的JavaDoc:http://developer.android.com/reference/android/database/Cursor.html

公共抽象布尔使用MoveToNext()

自:API级别1

将光标移动到 下一行。如果光标已经超过 结果集中的最后一个条目,则此方法将返回 。

返回:此举是否成功

+0

嗨维森特,没有必要使用moveToNext(),因为我只想返回一个特定的动物选择的单个生物。应用程序的流程如下:动物列表 - >动物页面(包括图片,和'传记'和'回'按钮) - >动物传记页面。所以你看,我根据列表中的动物位置查询数据库。我使用这个位置映射表中的_ID字段并返回相应的传记。 – Jnanathan 2011-04-24 19:58:02

+0

明白了。我们可以看到你的List Handler吗? – 2011-04-24 20:06:27

+0

通过listHandler你在谈论列表Activity吗?我跑了一个测试,看看是否正确传递了正确的位置,结果证明没问题。 – Jnanathan 2011-04-24 20:15:44

0

做这样的事情:

Cursor c=null; 
c=; 
try { 
if (c!=null) { 
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 

} 

} 
} finally { 
if (c!=null) { 
c.close(); 
} 
} 
+0

嗨奔腾,我试图用这个代码解决问题,它不工作!我可以访问数据库没有问题,它会返回信息给我。我只是感觉问题与行ID有关和列表项的定位。 – Jnanathan 2011-04-24 20:16:59

+0

我们没有关于'position'的信息。如果我的预感是正确的,那可能是选择列表中的连续数字。您需要将适配器跳到该位置并检索该位置上记录的唯一标识,并传递唯一标识而不是位置。 – Pentium10 2011-04-24 20:19:15

+0

你的预感是正确的,但我没有使用适配器,而是我使用上面的代码返回游标,检索传记的列索引,并将textView设置为biography的值。是否可以在此执行此操作方式? – Jnanathan 2011-04-24 20:22:15

0

我认为问题在于你在做你的SQL查询的方式。以下代码应该可以解决您的问题。

public Cursor getBio(int position) { 
    return qmDB.query(ANIMAL_TABLE, new String[]{KEY_ROWID,KEY_BIOGRAPHY}, "KEY_ROWID=?", new String[]{ position }, null, null, null); 
} 
+0

他的查询看起来不错。 – Ian 2011-04-25 03:02:12

+0

嗨Raunak,感谢您的建议,我已经尝试过这种方法,不幸的是它没有工作! – Jnanathan 2011-04-25 13:42:26

0

这似乎侮辱,但使用sqlitebrowser并确保您的唯一ID的真的是唯一的(也许你忘了自动增量?)你的代码现在看起来不错。

+0

嗨伊恩,我的创建语句包括一个自动增量,我知道有多行,因为列表中充满了来自同一张表的多个动物。 – Jnanathan 2011-04-25 13:43:40

+0

我想你编辑了你的查询方法。第三个参数肯定是(KEY_ROWID +“=”+位置),除非你使用?标记语法。 – Ian 2011-04-25 16:07:50

+0

是的,你的正确!我的查询没有问题,事实证明,整个问题都是基于数据库bing outdated..grr。 – Jnanathan 2011-04-25 16:44:03

0

既然你说你有一个列表,我假设你正在使用onListItemClick方法。因此,从用户点击的项目中获取名称(根据您的表格的位置1)。

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Cursor o = (Cursor) this.getListAdapter().getItem(position); 
     dbm.getBio(o.getString(1)); 
    } 

您在查询中使用的位置在我看来是有缺陷的。这是我认为你想要在你的getBio方法中做的事情:

public Cursor getBio(String name) { 
    return this.dbm.query(ANIMAL_TABLE, new String[]{KEY_BIOGRAPHY},"name='" + name + "'", null, null, null, null); 
}