执行结果我们可以通过Futures.addCallback来监听,方法如下所示:
Futures.addCallback(
putFuture,
object : FutureCallback<AppSearchBatchResult<String, Void>?> {
override fun onSuccess(result: AppSearchBatchResult<String, Void>?) {
// Gets map of successful results from Id to Void
val successfulResults = result?.successes
// Gets map of failed results from Id to AppSearchResult
val failedResults = result?.failures
Log.d(TAG, “成功:” + successfulResults.toString())
Log.d(TAG, “失败:” + failedResults.toString())
}
override fun onFailure(t: Throwable) {
Log.d(TAG, t.message.toString())
}
},
mainExecutor
)
运行,程序打印如下所示:
com.lonbon.appsearchdemo D/MainActivity: 成功:{new_id_1=null}
com.lonbon.appsearchdemo D/MainActivity: 失败:{}
说明存储成功了,接下来我们再插入一条数据,插入代码一致,就不重复展示了,数据如下所示:
val news2 = News(
namespace = “new1”,
id = “new_id_1”,
newsTitle = “Huang Linqing is handsome a boy”,
newsContent = “Huang Linqing is an Android development engineer working in Hefei”
)
查询数据
查询数据首先我们要指定查询的范围要就是namespace,相当于指定数据表,毕竟不同表中可能存在相同符合条件的数据。
val searchSpec = SearchSpec.Builder()
.addFilterNamespaces(“new1”)
.build()
然后执行查询操作,我们这里查询的关键字是”handsome“
val searchFuture = Futures.transform(
sessionFuture,
Function<AppSearchSession?, SearchResults> {
it?.search(“handsome”, searchSpec)
},
mainExecutor
)
同样的我们使用addCallback方法来检测查询结果,代码如下所示:
Futures.addCallback(
searchFuture,
object : FutureCallback {
override fun onSuccess(result: SearchResults?) {
iterateSearchResults(result)
}
override fun onFailure(t: Throwable) {
Log.d(
TAG, “查询失败:” + t
.message
)
}
},
mainExecutor
)
查询成功会返回SearchResults类,我们需要遍历这个实例取出所有数据打印出来,即iterateSearchResults方法,代码如下所示:
private fun iterateSearchResults(searchResults: SearchResults?) {
Futures.transform(searchResults?.nextPage, Function<List, Any> {
it?.let {
it.forEach { searchResult ->
val genericDocument: GenericDocument = searchResult.genericDocument
val schemaType = genericDocument.schemaType
if (schemaType == “News”) {
try {
var note = genericDocument.toDocumentClass(News::class.java)
Log.d(
TAG,
“查询结果:新闻标题-” + note.newsTitle
)
Log.d(
TAG,
“查询结果:新闻内容-” + note.newsContent
)
} catch (e: AppSearchException) {
Log.e(
TAG,
“Failed to convert GenericDocument to Note”,
e
)
}
}
}
}
}, mainExecutor)
}
查询出来的结果是一个集合,所以我们需要遍历集合,并且数据类型需要是News类才可以继续下一步,这里我们将符合条件查询的新闻标题打印出来,结果如下所示:
D/MainActivity: 查询结果:新闻标题-who is a boy
.appsearchdemo D/MainActivity: 查询结果:新闻内容-Everyone, guess who is the handsome boy
.appsearchdemo D/MainActivity: 查询结果:新闻标题-Huang Linqing is a handsome boy
.appsearchdemo D/MainActivity: 查询结果:新闻内容-Huang Linqing is an Android development engineer working
这里我们可以看到我们查询的关键字是handsome的时候将两个结果都打印出来了,而第一条结果是新闻标题包含handsome关键字,第二条结果是新闻内容包含关键字,如果我们使用普通的sql,大概需要这么做
select * from table where newsTitle like %key% or newsContent like %key%
而使用AppSearch 不需要关心具体匹配的是哪个字段,只要任一字段包含相关内容,就将结果显示出来,有点像百度搜索时,我们可以看到有些关键字是在标题中有些关键字是在内容中而这些内容都可以很快的查询出来。
我为什么夸自己
这里我们搜索的关键字是handsome,新闻标题是 Huang Linqing is a handsome boy,黄林晴是个帅气的男孩,这里我并不是故意夸我自己的,而是在学习AppSearch的使用时,我发现了一个bug,那就是上面的代码如果插入的是中文,在搜索时将不会得到任何结果,昨天晚上发现这个问题后我将此问题提给了Google
Google 也很快给了答复
不支持中文搜索,这是一个已知问题,并且Google将在新版本中修复,会尽快发布版本,所以我们在新版本发布前知道有这个问题就行了,避免无效检查自己的代码问题。
删除数据
删除数据时我们需指定命名空间和数据id,构建一个删除数据的请求,代码如下所示:
val deleteRequest = RemoveByDocumentIdRequest.Builder(“new1”)
.addIds(“new_id_2”)
.build()
val removeFuture = Futures.transformAsync(
sessionFuture, AsyncFunction {
it?.remove(deleteRequest)
},
mainExecutor
)
到这里,我们也看出来了,其实Appsearch的使用,对数据的操作都是先构建一个请求,然后使用Futures去执行,如果需要检测结果的话,就通过Futures.addCallback添加一个回调即可,这里执行删除操作后,我们再次通过关键字”handsome“去查询,会发现就只有一条数据显示出来了,这里执行结果就不在展示了。
关闭会话
在开始使用的使用,我们创建了一个
ListenableFuture,后续所有的数据操作都通过这个会话去建立的,在使用结束后我们需要关闭这个会话,代码如下所示:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
这里我希望可以帮助到大家提升进阶。
内容包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
ng)
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算