2011-04-05 43 views
2

作为标题状态我将数据从数据库链接到列表视图时遇到了一些问题,问题是适配器将只设置返回的最后一行,而不是每个来自数据库表的行。Android:setListAdapter仅设置数据库中的最后一行

什么,我想实现的一个例子:

表的动物:猴子 猫 狗 虎

将显示为只老虎在屏幕上。

我的方法从数据库返回游标:

public Cursor retrieveAnimals(){ 

    return = DB.query(ANIMAL_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_ANIMALNAME, 
      }, 
      null, 
      null, 
      null, 
      null, 
      null);  
} 

,并设置列表视图

dbm = new MyDBManager(this); 
    dbm.open(); 
    dbm.deleteAnimals(); 
    dbm.populateDB(); 

    // after populating, set the adapter.. 
    myCursor = dbm.getAllAnimals(); 

String[] columns = new String[] {"animal_name"}; 
int[] to = new int[] {R.id.animal}; 

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.row, myCursor, columns, to); 
    this.setListAdapter(mAdapter); 

我有一种感觉,我的问题出在光标位置,因为它会自动移动到最后一行设置适配器时,我一直在试图找到解决我的问题,但没有运气。

在此先感谢您的任何建议。

编辑:方法来填充DB

public long populateDB(){ 


    ContentValues initialValues = new ContentValues(); 

    for(int i = 0; i < animalName.length; i++){ 
     initialValues.put(KEY_ANIMALNAME, animalName[i]); 
    } 

    return DB.insert(ANIMAL_TABLE, null, initialValues); 

} 
+0

'myCursor.getCount()'返回什么? – rajath 2011-04-05 13:48:05

回答

1

在你retrieveAnimals(),此行应该是return DB.query(...)(注意:returnDB.query之间缺乏=的)。

除此之外,你的代码看起来不错。你应该在光标上调用startManagingCursor(在调用getAllAnimals后)以避免内存泄漏。

编辑:改变你填入方法:

public long[] populateDB(){ 


    ContentValues initialValues = new ContentValues(); 
    long[] rowIds = new long[animalName.length]; 

    for(int i = 0; i < animalName.length; i++){ 
     // here we are using a single ContentValues object and inserting it 
     // into the DB before changing the ContentValues and inserting it again 
     initialValues.put(KEY_ANIMALNAME, animalName[i]); 
     rowIds[i] = DB.insert(ANIMAL_TABLE, null, initialValues); 
    } 

    return rowIds; 

} 

或者(更多的内存使用情况,但有用的也许是,如果你需要将它们插入之前修改了一些记录):

public void populateDB(){ 

    ContentValues[] initialValues = new ContentValues[animalName.length]; 

    for(int i = 0; i < animalName.length; i++){ 
     // create a new ContentValues for each object 
     initialValues[i] = new ContentValues(); 
     initialValues[i].put(KEY_ANIMALNAME, animalName[i]); 
    } 

    // now our contentvalues is filled we can insert them all 
    for(int i = 0; i < animalName.length; i++){ 
     DB.insert(ANIMAL_TABLE, null, initialValues[i]); 
    } 
} 
+0

感谢Joseph的答复,当我分配一个游标并返回它时,剩下的就是上面的方法,一切都没有改变。 – Jnanathan 2011-04-05 13:59:52

+0

在这种情况下,根据@ Rajath的评论 - myCursor.getCount()给你什么?如果答案是1,那么数据库仅从数据库返回1条记录。 – 2011-04-05 14:07:17

+0

getCount()返回1.我用我的方法编辑原始帖子来填充数据库,我似乎无法挑选它的问题。所以我的问题基本上是游标只返回1行时应该有一些。 – Jnanathan 2011-04-05 14:33:53

1

难道你试试

myCursor.moveToFirst() 
+0

嗨Rajath感谢您的建议,我从数据库检索游标后立即添加此代码,它没有任何区别。 – Jnanathan 2011-04-05 14:00:14

相关问题