如何将基于JSI的React本机库指定前处理器标志
#reactnative #android #ios #sqlite

嗨,是takuya。
我正在构建一个名为Inkdrop的笔记应用程序,用于使用React Native。

该应用程序使用React-Native-Quick-Sqlite,Sqlite的快速包装器:

GitHub logo ospfranco / react-native-quick-sqlite

快速SQLITE用于反应。

screenshot

纱线添加反应 -  Quick-sqlite
			NPX POD安装


Quick Sqlite嵌入了最新版本的SQLite,并提供了低级JSI支持的API来执行SQL查询。通过使用嵌入式SQLITE,您可以访问最新的安全补丁和最新功能。

性能指标没有故意发布,anecdotic testimonies建议在2倍至5倍的速度提高之间。

Gotchas

  • JavaScript不能表示大于53位的整数,如果数据来自其他系统,请在加载数据时小心。 Read more
  • 不可能使用浏览器调试JSI应用程序,使用Flipper(对于Android Flipper也有SQLite数据库Explorer)。

 /** 
			 *所有sqlite命令结果至少将具有此状态定义:
			 *特定的语句或动作可以带来更多数据,相对于其上下文
			 *状态:0或未定义以进行正确执行,1对于错误
			 *消息:如果status === 1,您将在这里找到错误 
â€

它嵌入了C/C ++中的最新版本。
这意味着您在Xcode和Android Studio(CMake)上的RN项目中的源构建了SQLite。

它默认不启用任何编译时间选项,我需要在我的应用中启用FTS5以进行全文搜索。
它可以通过specifying a koude0 pre-processor flag when compiling启用。

我设法启用了fts5,我想在您的项目中分享如何做到这一点。
对于Android,图书馆需要进行一些更改。因此,这对于支持接受自定义构建标志的图书馆维护者会有所帮助。

ios

幸运的是,Cocoapods允许您通过Podfile自定义PODS项目设置:

在您的<PROJECT_ROOT>/ios/Podfile上添加一个post_install块:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "react-native-quick-sqlite" then
      target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '<SQLITE_FLAGS>']
      end
    end
  end
end

用要添加的标志替换<SQLITE_FLAGS>零件。
例如,您可以将SQLITE_ENABLE_FTS5=1添加到GCC_PREPROCESSOR_DEFINITIONS中以在iOS项目中启用fts5。

安卓

本机模块与读取CMakeLists.txt的cmake编辑。

cmake支持使用koude8 command添加标志。

在库的cmakelists.txt中添加以下几行:

add_definitions(
  ${SQLITE_FLAGS}
)

它通过变量SQLITE_FLAGS指定标志,需要在react-native-quick-sqlite/android/build.gradle中指定这样的标志:

def SQLITE_FLAGS = rootProject.properties['quickSqliteFlags']

android {
  defaultConfig {
    externalNativeBuild {
        cmake {
            arguments '-DANDROID_STL=c++_shared',
              "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}",
              "-DNODE_MODULES_DIR=${nodeModules}",
              "-DSQLITE_FLAGS='${SQLITE_FLAGS ? SQLITE_FLAGS : ''}'"
        }
    }

现在,您可以像这样定义<PROJECT_ROOT>/android/gradle.properties中的标志:

quickSqliteFlags="<SQLITE_FLAGS>"

就是这样!
我已向快速SQLITE存储库发送了拉动请求:

feat(ios&android): Support specifying pre-processor flags to sqlite #86

我通过指定预处理器标志来设法在iOS和Android上启用FTS5。

在Android上,我们需要接受父项目的设置。 该公关使通过android/gradle.properties指定sqlite标志。

另外,我添加了有关如何为iOS和Android做到这一点的说明。 也许语法可以改善。

修复#37

希望会有所帮助。


在线关注我