我想使用
SQLite
在 regexp
中使用 Android
运行查询。
我该怎么做?
不幸的是,Android 目前似乎没有提供一种将用户函数注入到 sqlite 中的方法,而这是你需要使
REGEXP
工作的方法(具体来说,你需要一个名为 regexp()
的用户函数) )——因此您可能必须进行更广泛的选择(使用比您想要的正则表达式更广泛的 LIKE
条件),并在应用程序中进一步区分“实际”结果(那些真正与您想要的正则表达式匹配的结果)与 java.util.regex
.
这里的聚会已经很晚了,但您可以在 Room 中使用 REGEXP - 您只需先启用它即可。首先,在您的 @Dao 接口中,设置一个 @RawQuery 函数(在 Kotlin 中):
@Dao
interface WordsDao {
@RawQuery
fun getMatches(query: SimpleSQLiteQuery): List<Word>
@RawQuery
fun enableRegexp(query: SimpleSQLiteQuery): Boolean
}
然后您需要使用查询来调用它以启用 REGEXP:
private fun enableRegexp() {
Single.fromCallable {
appDB?.wordsDao()?.enableRegexp(SimpleSQLiteQuery("PRAGMA compile_options='ENABLE_REGEXP'"))
}.doOnSuccess {
Log.d("REGEXP", "Success")
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
现在您可以使用正则表达式在数据库上运行 SELECT 查询:
appDB?.wordsDao()?.getMatches(SimpleSQLiteQuery("SELECT * FROM words_alpha WHERE word REGEXP '^[olgf]{4}+\$'"))
模式是编译后的正则表达式。很多情况下,方便 String.matches、String.replaceAll 和 String.split 等方法 会更好,但如果你需要用同样的东西做很多工作 正则表达式,编译一次可能会更有效 重复使用它。 Pattern 类及其同伴 Matcher 还提供 比 String 暴露的少量功能更多。
http://developer.android.com/reference/java/util/regex/Pattern.html