You need to enable JavaScript to run this app. Android旧版日记应用实现SQLite搜索并在ListView展示结果咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:39:03