Android旧版日记应用实现SQLite搜索并在ListView展示结果咨询
Android端日记应用搜索功能实现方案
步骤1:修改SecondDataBaseHelper数据库帮助类
首先修复现有代码的两处错误,新增模糊搜索方法:
- 修复游标取值索引错误:SQL查询返回的游标列索引从0开始,原有populateDiaryListArray方法里取值索引全部偏移1位,导致字段对应错误
- 修复更新语句语法错误:updateDiaryInDB方法里的条件
COL_1 + " ?= "语法错误,需改为COL_1 + " = ?" - 新增searchDiaryByKeyword方法,支持模糊匹配日记标题、内容字段
// 新增到SecondDataBaseHelper类中 public ArrayList<Diary> searchDiaryByKeyword(String keyword) { ArrayList<Diary> searchResult = new ArrayList<>(); SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); // 模糊匹配标题或内容包含关键词的条目,不区分大小写 String searchSql = "SELECT * FROM " + TABLE_NM + " WHERE " + COL_2 + " LIKE ? OR " + COL_3 + " LIKE ?"; String[] args = new String[]{"%" + keyword + "%", "%" + keyword + "%"}; try (Cursor result = sqLiteDatabase.rawQuery(searchSql, args)) { if (result.getCount() != 0) { while (result.moveToNext()) { String id = result.getString(0); String subject = result.getString(1); String content = result.getString(2); String date = result.getString(3); String latitude = result.getString(4); String longitude = result.getString(5); Diary diary = new Diary(id, subject, content, date, latitude, longitude); searchResult.add(diary); } } } return searchResult; }
步骤2:完善SearchEntries页面逻辑
直接替换SearchEntries类的完整代码:
import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; import java.util.ArrayList; public class SearchEntries extends AppCompatActivity { private EditText searchTextField; private ListView diarySearchResults; private DiaryAdapter searchAdapter; private SecondDataBaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_entries); // 初始化控件和工具类 searchTextField = findViewById(R.id.searchTextField); diarySearchResults = findViewById(R.id.diarySearchResults); dbHelper = SecondDataBaseHelper.databaseInstance(this); // 初始化适配器,默认空列表 searchAdapter = new DiaryAdapter(this, new ArrayList<>()); diarySearchResults.setAdapter(searchAdapter); // 监听输入框内容变化,实时搜索 searchTextField.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String keyword = s.toString().trim(); ArrayList<Diary> result = dbHelper.searchDiaryByKeyword(keyword); // 更新适配器数据 searchAdapter.clear(); searchAdapter.addAll(result); searchAdapter.notifyDataSetChanged(); } @Override public void afterTextChanged(Editable s) {} }); } }
可选优化
如果需要条目展示ID和主题拼接的内容,你可以直接修改DiaryAdapter的getView方法,调整两个TextView的显示格式即可,现有适配器已经分别加载了ID和主题字段,符合需求。
内容的提问来源于stack exchange,提问作者ZapRowsdower
相关产品推荐
相关产品推荐

