#android #database #adapter
#Android #База данных #адаптер
Вопрос:
В моей базе данных у меня есть 2 таблицы. Для таблицы я хочу отображать только элементы, которые имеют определенный идентификатор во втором столбце. У меня есть адаптер для всех элементов из таблицы, но я не знаю, как это должно выглядеть для просмотра только тех элементов, которые мне нужны. Приветствуется любая идея.
Вот мой адаптер :
private void populate(){
c=prod.fetchAll();
startManagingCursor(c);
adapter=new SimpleCursorAdapter(this,R.layout.listproduct,c,
new String[] {ProductDbAdapter.KEY_ITEM,ProductDbAdapter.KEY_QUANTITY,ProductDbAdapter.KEY_UNITS},
new int[] {R.id.prod1,R.id.prod2,R.id.prod3});
lv.setAdapter(adapter);
}
Код для ProductDbAdapter является :
public class ProductDbAdapter extends AbstractDbAdapter {
public static final String KEY_LISTID = "list_id";
public static final String KEY_ITEM = "item";
public static final String KEY_QUANTITY="quantity";
public static final String KEY_UNITS="units";
public static final String KEY_ROWID = "_id";
private static final String DATABASE_TABLE = "products";
public ProductDbAdapter(Context ctx) {
super(ctx);
}
public long create(Integer listid, String item,String quantity,String units) {
ContentValues args = new ContentValues();
args.put(KEY_LISTID,listid);
args.put(KEY_ITEM,item);
args.put(KEY_QUANTITY,quantity);
args.put(KEY_UNITS,units);
return mDb.insert(DATABASE_TABLE, null,args);
}
public boolean updateproduct(long rowId,Integer listid, String item,String quantity,String units) {
ContentValues values = new ContentValues();
values.put(KEY_LISTID, listid);
values.put(KEY_ITEM, item);
values.put(KEY_QUANTITY, quantity);
values.put(KEY_UNITS,units);
return mDb.update(DATABASE_TABLE, values, KEY_ROWID "=" rowId, null) > 0;
}
public boolean delete(long rowId) {
return mDb.delete(DATABASE_TABLE, KEY_ROWID "=" rowId, null) > 0;
}
public Cursor fetchAll() {
return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_LISTID,KEY_ITEM,KEY_QUANTITY,
KEY_UNITS}, null, null, null, null, null);
}
public Cursor fetch(long rowId) throws SQLException {
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_LISTID,KEY_ITEM,KEY_QUANTITY, KEY_UNITS}, KEY_ROWID "=" rowId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
}
Что я пытаюсь сделать, так это отобразить только элементы с определенным list_id..
Ответ №1:
Почему вы запрашиваете курсор, который возвращает все элементы, когда вам нужны только элементы с определенным идентификатором? Измените свой запрос к базе данных, чтобы вы получали только элементы с идентификаторами, которые вы определяете в операторе where вашего запроса к базе данных.
Предоставьте базе данных so работу по фильтрации правильных элементов для вас, это не работа адаптера.
Комментарии:
1. Можете ли вы сказать мне, как я могу это сделать? Что я должен изменить?
2. Я не знаю дизайн вашей базы данных, поэтому трудно сказать вам точно, что делать. Вы должны изменить метод fetchAll(). Вы должны передать ему список идентификаторов, который должен совпадать со вторым столбцом элементов. В рамках метода вы создаете запрос к базе данных, в котором запрашиваете только элементы, значение второго столбца которых равно одному из идентификаторов, переданных вами в метод.
Ответ №2:
В ProductDbAdapter
Попробуйте что-то вроде…
public Cursor fetchListId(long listId) throws SQLException {
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_LISTID,KEY_ITEM,KEY_QUANTITY, KEY_UNITS},
KEY_LISTID "=" listId, null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}