Android浏览历史sqlite功能,[Android]greendao实现搜索历史功能
使用greendao实现搜索历史功能
ezgif-1-378e749b52.gif
device-2017-08-31-103330.png
之前封装sqlite实现过这功能,不过原生封装使用sql语句,而且greendao功能更强大(对不会sql的我来说更方便写),So...
PRE 依赖greendao
WARMING:
methodscount.com.png
greendao实体
@Entity
public class SearchHistory {
@Id(autoincrement = true) //自增主键
private Long id;
@Unique // 搜索记录(唯一)
private String name;
}
build gradle | make project(ctrl + F9),自动生成代码
public class MyApp extends Application {
private static MyApp instance;
private static DaoSession daoSession;
public static MyApp getInstance() {
return instance;
}
public static DaoSession getDaoInstant() {
return daoSession;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
setupDatabase("database.db");
}
/**
* 配置数据库
*/
private void setupDatabase(String name) {
//创建数据库
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, name, null);
//获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
}
}
public class SearchHistoryDao {
/**
* 添加数据
*
* @param searchHistory
*/
public static void insertHistory(SearchHistory searchHistory) {
MyApp.getDaoInstant().getSearchHistoryDao().insertOrReplace(searchHistory);
}
/**
* 删除数据
*
* @param searchHistory
*/
public static void deleteHistory(SearchHistory searchHistory) {
MyApp.getDaoInstant().getSearchHistoryDao().delete(searchHistory);
}
/**
* 查询全部数据
*
* @return List
*/
public static List queryAll() {
return MyApp.getDaoInstant().getSearchHistoryDao().loadAll();
}
/**
* 清空数据
*/
public static void clearAll() {
MyApp.getDaoInstant().getSearchHistoryDao().deleteAll();
}
}
详细代码方便以后需要copy
xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1E8AE8">
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_margin="8dp"
android:background="@android:color/white"
android:gravity="center_vertical">
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
android:padding="6dp"
android:src="@drawable/ic_arrow_left"
android:tint="@android:color/darker_gray" />
android:id="@+id/edit_search"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/white"
android:hint="搜索知乎内容"
android:imeOptions="actionSearch"
android:inputType="text"
android:maxLines="1" />
android:id="@+id/btn_searchdelete"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:src="@drawable/ic_delete"
android:tint="@android:color/darker_gray"
android:visibility="gone"
tools:visibility="visible" />
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/recommandsearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp">
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center_vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:padding="6dp"
android:src="@drawable/ic_search" />
android:id="@+id/tv_recommandsearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:gravity="center_vertical"
tools:text="演技能烂到什么程度"
android:textColor="@android:color/black"
android:textSize="16dp" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:id="@+id/listview_search_history"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:id="@+id/btn_clearall"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:text="清除历史记录"
android:textColor="@android:color/holo_blue_light" />
item
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp">
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:paddingRight="6dp"
android:src="@drawable/ic_history"
android:tint="@android:color/darker_gray" />
android:id="@+id/tv_recommandsearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="8dp"
android:layout_toLeftOf="@id/btn_delete"
android:layout_toRightOf="@id/icon"
android:ellipsize="end"
android:gravity="center_vertical"
android:lines="1"
android:text="演技能烂到什么程度"
android:textSize="16dp" />
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingLeft="6dp"
android:src="@drawable/ic_delete"
android:tint="@android:color/darker_gray" />
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_alignParentBottom="true"
android:background="@android:color/black" />
所有ic_的图片为android studio Vector Asset
Adapter
public class SearchAdapter extends RecyclerView.Adapter {
private Context context;
private List list;
public SearchAdapter(Context context, List list) {
this.context = context;
this.list = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_search_history, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvRecommandsearch.setText(list.get(position).getName());
holder.btnDelete.setOnClickListener(view -> deleteListener.OnDelete(position));
holder.itemView.setOnClickListener(view -> itemClickListener.OnItemClick(position));
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tv_recommandsearch)
TextView tvRecommandsearch;
@BindView(R.id.btn_delete)
ImageView btnDelete;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
private OnDeleteListener deleteListener;
private OnItemClickListener itemClickListener;
public interface OnDeleteListener {
void OnDelete(int position);
}
public interface OnItemClickListener {
void OnItemClick(int position);
}
public void setOnDeleteListener(OnDeleteListener deleteListener) {
this.deleteListener = deleteListener;
}
public void setOnItemClickListener(OnItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
}
Activity
public class SearchActivity extends BaseActivity {
@BindView(R.id.btn_back)
ImageView btnBack;
@BindView(R.id.edit_search)
EditText editSearch;
@BindView(R.id.btn_searchdelete)
ImageView btnSearchdelete;
@BindView(R.id.tv_recommandsearch)
TextView tvRecommandsearch;
@BindView(R.id.recommandsearch)
CardView recommandSearch;
@BindView(R.id.listview_search_history)
RecyclerView listview;
@BindView(R.id.btn_clearall)
TextView btnClearall;
private final int DELETEONE = 0X001;
private final int DELETEALL = 0X002;
private SearchAdapter adapter;
private List list;
@Override
protected void bindViews() {
setContentView(R.layout.activity_search);
}
@Override
protected void initView() {
}
@Override
protected void initData() {
tvRecommandsearch.setText(getIntent().getStringExtra("recommandsearch"));
recommandSearch.setOnClickListener(view -> {
editSearch.setText(tvRecommandsearch.getText());
insertHistory();
});
list = new ArrayList<>();
adapter = new SearchAdapter(this, list);
listview.setLayoutManager(new LinearLayoutManager(this));
listview.setAdapter(adapter);
adapter.setOnDeleteListener(position -> deleteHistory(DELETEONE, position));
adapter.setOnItemClickListener(position -> {
editSearch.setText(list.get(position).getName());
insertHistory();
});
btnClearall.setOnClickListener(view -> showDeleteDialog());
queryHistory();
}
@Override
protected void initActionBar() {
btnBack.setOnClickListener(view -> finish());
editSearch.setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_SEARCH && !TextUtils.isEmpty(editSearch.getText().toString().trim())) {
ToastUtils.shortToast(editSearch.getText().toString().trim());
insertHistory();
}
return true;
});
editSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().length() > 0) {
btnSearchdelete.setVisibility(View.VISIBLE);
} else {
btnSearchdelete.setVisibility(View.GONE);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
btnSearchdelete.setOnClickListener(view -> editSearch.setText(""));
}
private void showDeleteDialog() {
new AlertDialog.Builder(this)
.setMessage("确认清除所有搜索记录吗?")
.setPositiveButton("确定", (dialogInterface, i) -> deleteHistory(DELETEALL, 1))
.setNegativeButton("取消", null)
.setCancelable(true)
.create().show();
}
private void insertHistory() {
SearchHistory searchHistory = new SearchHistory();
searchHistory.setName(editSearch.getText().toString().trim());
SearchHistoryDao.insertHistory(searchHistory);
queryHistory();
}
private void deleteHistory(int TAG, int position) {
if (TAG == DELETEONE)
SearchHistoryDao.deleteHistory(list.get(position));
else if (TAG == DELETEALL)
SearchHistoryDao.clearAll();
queryHistory();
}
private void queryHistory() {
list.clear();
list.addAll(SearchHistoryDao.queryAll());
Collections.reverse(list);
adapter.notifyDataSetChanged();
}
}
SearchHistoryDao有命名问题的坑,踩踩更健康
Android浏览历史sqlite功能,[Android]greendao实现搜索历史功能相关推荐
- vue 实现搜索历史_微信小程序实现搜索历史功能
结合了微信给的资料,马马虎虎摸索出了一些东西,下面说一下微信小程里序搜索历史功能的实现,下图是实现效果. 首先,定义历史记录的显示风格和方式,在下用的是列表模式,没有使用什么比较酷炫的套路. {{it ...
- android 搜索历史流布局,Android-流布局-FlowLayout在搜索历史中的应用-0920.doc
Android-搜索历史的实现+FlowLayout应用-(2016-9-20) 项目: SearchModel29 环境: Android Studio 1.0 项目下载地址: /s/1hrKnd5 ...
- 乐视android版本怎么升级,乐视网android手机客户端升级推出V2.0版
乐视网 android手机客户端V2.0版--"乐视影视"正式发布,据乐视网运营副总裁高飞介绍,"V2.0版是早期发布的乐视网android手机客户端V1.5版的升级版本 ...
- GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索
之前写过一个静态的搜索页 FlowLayout流式布局实现标签.类似热门搜索这种效果 只是能实现界面效果,但是往往开发中是要把搜索历史缓存到本地数据库中,所以在原基础上添加了数据库功能. 并且把搜索框 ...
- 搜索功能(六)-清空历史关键字
清空历史关键字 清空本地存储个历史记录, clearHistory () {// 清空搜索关键字的历史信息// 清空的是本地存储的数据(清空本地存储的数据并不会影响data中的数据)mpvue.cle ...
- php 实现联想式 搜索,PHP实现搜索联想功能(基于字典树算法)
搜索联想功能是各大搜索引擎具备的基础功能,如下图所示,这个功能简化了用户的输入行为,并且能够给用户推荐热门的搜索词,下面我们来讲一下如何用php实现搜索联想的功能. 实现原理 搜索联想功能拆解一下由两 ...
- javascript搜索框联想搜索_JavaScript实现搜索联想功能
-.虽然Jquery已经有了一个完整的包 实现前端搜索联想功能,但是出于学习还是想了解一下实现此功能的原理性 回想起来 实现此功能很简单,1.前端输入字符串 文本改变 异步请求服务器 将返回的资料显示 ...
- 通过jQuery实现淘宝搜索提示功能
一.先来展示下功能: 淘宝搜索提示功能 二.实现: 1.大体实现思路: 先从input框里获得输入的内容,再把得到的内容通过jQuery封装的ajax以jsonp的形式发送出去.接着把响应回来的数据渲 ...
- Android原生SQLite操作以及greenDao框架操作SQLite
本文分为2个大的方面来讲SQLite操作:原生操作,框架操作 原生操作 首先我们要创建一个数据库打开帮助类 ,目的是创建数据库和表,升级数据库 import android.content.Conte ...
最新文章
- linux与windows下开发,Linux 与 Windows下开发感受
- redux-form(V7.4.2)笔记(一)
- 只允许特定的组用户su切换到root
- 13002.tcp客户端程序(python)
- vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
- 单目视觉里程计的尺度问题的疑问?
- python设置很大的刻度_【Matplotlib】设置刻度(1)
- java 0点时间_java 获取当前时间与零点的时间差
- PQ分区魔术师v9.0 中文版
- 2021年电赛F题智能送药小车(国二)开源分享
- 【技术分享】Win10 wampserver升级安装php7.2.32
- ES 索引创建及查询
- windows挂载webdav
- 阿里云OSS文件上传,后台签名方案
- java杂谈(瞎吉尔找的练习)
- 怎么用计算机进行曲线拟合,excel怎么进行曲线拟合 excel曲线拟合图文教程
- 电脑不小心被格式化了 里面的应用软件如何恢复?
- flowable+tomcat部署flowable项目,在线画流程图
- hbase报错总结01_李孟_新浪博客
- LEHDLAB_实验流程
热门文章
- 天行未连接服务器未响应,WOW 奥拉基尔服务器好吗? 人口和各个方面都怎么样?...
- python 判断图片的类型
- 足迹APP简单开发实例
- 如何在C艹大作业上用复数计算器拿下一个100分
- 关于CSS--基础样式、盒子模型和颜色
- Go语言(Golang)高并发处理思路
- 苹果手机计算机的使用记录,苹果iPhone手机求一款记录日常工作内容的便签app
- 区块链+汽车供应链物流服务平台“运链盟”正式上线,已有融资款发放
- 《MySQL 深入浅出》 1-17章节 阅读整理
- CreateCompatibleDC()和GetDC()区别在哪里