Как фильтровать содержимое SQLite в ListVIew?
Должно получится что-то вроде этого:
но фильтрация не происходит:
Код PreparationDBHelper:
public class PreparationDBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "PreparationDb";
public static final String TABLE_TEXT = "textTable";
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_TEXT = "text";
public PreparationDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_TEXT + "(" + KEY_ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + KEY_NAME + " text," + KEY_TEXT + " text" + ")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_TEXT);
onCreate(db);
}
/* public SQLiteDatabase open()throws SQLException {
return SQLiteDatabase.openDatabase(DATABASE_NAME, null, SQLiteDatabase.OPEN_READWRITE);
}*/
}
Код Activity:
public class CureSearchActivity extends AppCompatActivity {
PreparationDBHelper sqlHelper;
SQLiteDatabase db;
Cursor userCursor;
SimpleCursorAdapter userAdapter;
ListView userList;
EditText userFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cure_search);
userList = (ListView)findViewById(R.id.userList);
userFilter = (EditText)findViewById(R.id.userFilter);
sqlHelper = new PreparationDBHelper(getApplicationContext());
// создаем базу данных
// sqlHelper.create_db();
}
@Override
public void onResume() {
super.onResume();
try {
// db = sqlHelper.open();
db = sqlHelper.getReadableDatabase();//чтение базы данных
userCursor = db.rawQuery("select * from " + PreparationDBHelper.TABLE_TEXT, null);
String[] headers = new String[]{PreparationDBHelper.KEY_NAME/*, PreparationDBHelper.KEY_TEXT*/};
userAdapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item,
userCursor, headers, new int[]{android.R.id.text1/*, android.R.id.text2*/}, 0);
// если в текстовом поле есть текст, выполняем фильтрацию
// данная проверка нужна при переходе от одной ориентации экрана к другой
if(!userFilter.getText().toString().isEmpty())
userAdapter.getFilter().filter(userFilter.getText().toString());
// установка слушателя изменения текста
userFilter.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
// при изменении текста выполняем фильтрацию
public void onTextChanged(CharSequence s, int start, int before, int count) {
userAdapter.getFilter().filter(s.toString());
}
});
// устанавливаем провайдер фильтрации
userAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
if (constraint == null || constraint.length() == 0) {
return db.rawQuery("select * from " + PreparationDBHelper.TABLE_TEXT, null);
}
else {
return db.rawQuery("select * from " + PreparationDBHelper.TABLE_TEXT + " where " +
PreparationDBHelper.DATABASE_NAME + " like ?", new String[]{"%" + constraint.toString() + "%"});
}
}
});
userList.setAdapter(userAdapter);
}
catch (SQLException ex){}
}
@Override
public void onDestroy(){
super.onDestroy();
// Закрываем подключение и курсор
db.close();
userCursor.close();
}
}
Возможно, дело в чтении из бд db = sqlHelper.getReadableDatabase();//чтение базы данных
Хотя я и не уверен
Подскажите, пожалуйста, как сделать так, чтобы фильтрация происходила (как на верхнем рисунке)

