【转】android利用数据库实现搜索联想功能
2011-05-16 13:44
876 查看
主要实现的效果是和google搜索一样,实现联想功能,如用户输入a,列表中则显示以a开头的数据库中的信息。下面是实现的效果图:
实现过程主要是添加所有的数据到数据库中。
调用搜索控件,可见android利用onSearchRequested()调用内部搜索ui组件。
根据用户输入的信息显示联想的所有词的列表。
根据用户选择,显示相应的结果。
实现的主要代码:
public class SearchProvider extends ContentProvider {
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
// 添加所有的数据
SearchUtil.getInstance().ensureLoaded();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String query = null;
if (uri.getPathSegments().size() > 1) {
query = uri.getLastPathSegment().toLowerCase();
}
return getSuggestions(query);
}
private Cursor getSuggestions(String query) {
String processedQuery = query == null ? "" : query.toLowerCase();
List<SearchUtil.Word> words = SearchUtil.getInstance().getMatches(
processedQuery);
MatrixCursor cursor = new MatrixCursor(COLUMNS);
long id = 0;
for (SearchUtil.Word word : words) {
cursor.addRow(columnValuesOfWord(id++, word));
}
return cursor;
}
private Object[] columnValuesOfWord(long id, SearchUtil.Word word) {
return new Object[] { id, // _id
word.word, // text1
word.definition, // text2
word.word, // intent_data (included when clicking on item)
};
}
private static final String[] COLUMNS = { "_id",
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,// 数据传递到intenter中
};
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
相关搜索的配置:
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SearchActivty" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name=".ResultActivty" android:label="@string/search_query_results">
</activity>
<provider android:name="SearchProvider"
android:authorities="search"
android:syncable="false" />
</application>
在res的xml文件夹下创建searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search_label"
android:searchSuggestAuthority="search"
android:searchSuggestIntentAction="android.intent.action.VIEW"
>
</searchable>
结果返回:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = this.getIntent();
setContentView(R.layout.main);
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
SearchUtil.Word theWord = SearchUtil.getInstance().getMatches(
intent.getDataString().trim().toLowerCase()).get(0);
launchWord(theWord);
finish();
} else {
Button button = (Button) findViewById(R.id.button);
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
onSearchRequested();
return false;
}
});
}
}
private void launchWord(SearchUtil.Word pavilion) {
Intent next = new Intent();
next.setClass(this, ResultActivty.class);
Bundle bundle = new Bundle();
bundle.putString("word", pavilion.word);
next.putExtras(bundle);
next.putExtras(bundle);
startActivity(next);
}
其中联想的列表还可以实现自定义的列表,需要进一步细化。
源代码:http://easymorse-android.googlecode.com/svn/tags/search/
实现过程主要是添加所有的数据到数据库中。
调用搜索控件,可见android利用onSearchRequested()调用内部搜索ui组件。
根据用户输入的信息显示联想的所有词的列表。
根据用户选择,显示相应的结果。
实现的主要代码:
public class SearchProvider extends ContentProvider {
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
// 添加所有的数据
SearchUtil.getInstance().ensureLoaded();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String query = null;
if (uri.getPathSegments().size() > 1) {
query = uri.getLastPathSegment().toLowerCase();
}
return getSuggestions(query);
}
private Cursor getSuggestions(String query) {
String processedQuery = query == null ? "" : query.toLowerCase();
List<SearchUtil.Word> words = SearchUtil.getInstance().getMatches(
processedQuery);
MatrixCursor cursor = new MatrixCursor(COLUMNS);
long id = 0;
for (SearchUtil.Word word : words) {
cursor.addRow(columnValuesOfWord(id++, word));
}
return cursor;
}
private Object[] columnValuesOfWord(long id, SearchUtil.Word word) {
return new Object[] { id, // _id
word.word, // text1
word.definition, // text2
word.word, // intent_data (included when clicking on item)
};
}
private static final String[] COLUMNS = { "_id",
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,// 数据传递到intenter中
};
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
相关搜索的配置:
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SearchActivty" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name=".ResultActivty" android:label="@string/search_query_results">
</activity>
<provider android:name="SearchProvider"
android:authorities="search"
android:syncable="false" />
</application>
在res的xml文件夹下创建searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search_label"
android:searchSuggestAuthority="search"
android:searchSuggestIntentAction="android.intent.action.VIEW"
>
</searchable>
结果返回:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = this.getIntent();
setContentView(R.layout.main);
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
SearchUtil.Word theWord = SearchUtil.getInstance().getMatches(
intent.getDataString().trim().toLowerCase()).get(0);
launchWord(theWord);
finish();
} else {
Button button = (Button) findViewById(R.id.button);
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
onSearchRequested();
return false;
}
});
}
}
private void launchWord(SearchUtil.Word pavilion) {
Intent next = new Intent();
next.setClass(this, ResultActivty.class);
Bundle bundle = new Bundle();
bundle.putString("word", pavilion.word);
next.putExtras(bundle);
next.putExtras(bundle);
startActivity(next);
}
其中联想的列表还可以实现自定义的列表,需要进一步细化。
源代码:http://easymorse-android.googlecode.com/svn/tags/search/
相关文章推荐
- Android----android利用数据库实现搜索联想功能
- android 利用数据库实现历史搜索记录功能
- Android 利用AutoCompleteTextView实现模糊搜索功能,搜索结果自动提示,识别拼音首字母并转汉字提示
- 利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。
- 利用 Android 系统原生 API 实现分享功能
- android定时定位 - 利用百度定位API来实现定时定位功能
- Android 利用 RXJAVA interval 操作符 实现 计时器 功能
- Android实现带列表的地图POI周边搜索功能
- Android通讯录开发之通讯录联系人搜索功能最新实现
- 利用MySQL自带的C API函数实现数据库功能调用
- LINE分享android利用系统自带分享实现LINE分享功能
- Android联系人列表,实现ListView的A-Z字母排序和过滤搜索功能,字母条目上顶
- 举例说明如何在android中利用Service来实现后台发送邮件功能
- [转] 利用AJAX实现搜索提示功能 (关键字自动匹配功能)
- 利用SQL语言,实现数据库的备份/恢复的功能
- Android 利用工具实现一键自动findViewById功能
- Android实现ListView的A-Z字母排序和过滤搜索功能
- 简单实现Android搜索功能 显示清除历史搜索记录
- 利用反射实现对sqlite3数据库的crud(增删改查)操作的一个baseAndroidDao封装,安卓开发中
- Android搜索功能的实现