Как сказал @jbworld, вы не можете загружать динамические библиотеки на iPhone, поэтому эта ссылка должна создаваться статически во время компиляции. Читая код пространственного объекта (это расширение SQLite), я обнаружил такой вызов:
void spatialite_init (int verbose) {
/* used when SQLite initializes SpatiaLite via statically linked lib */
sqlite3_auto_extension ((void (*)(void)) init_static_spatialite);
}
И init_static_spatialite
код:
static void init_static_spatialite (sqlite3 * db, char **pzErrMsg,
const sqlite3_api_routines * pApi)
{
SQLITE_EXTENSION_INIT2 (pApi);
/* setting the POSIX locale for numeric */
setlocale (LC_NUMERIC, "POSIX");
*pzErrMsg = NULL;
sqlite3_create_function (db, "spatialite_version", 0, SQLITE_ANY, 0,
fnct_spatialite_version, 0, 0);
sqlite3_create_function (db, "proj4_version", 0, SQLITE_ANY, 0,
fnct_proj4_version, 0, 0);
sqlite3_create_function (db, "geos_version", 0, SQLITE_ANY, 0,
fnct_geos_version, 0, 0);
sqlite3_create_function (db, "GeometryConstraints", 3, SQLITE_ANY, 0,
fnct_GeometryConstraints, 0, 0);
sqlite3_create_function (db, "CheckSpatialMetaData", 0, SQLITE_ANY, 0,
fnct_CheckSpatialMetaData, 0, 0);
...
Похоже, что sqlite_auto_extension
позволяет вам статически связать расширение. Документация , кажется, подтверждает, что:
«Этот API можно вызвать при запуске программы, чтобы зарегистрировать одно или несколько статически связанных расширений, которые будут доступны для всех новых подключений к базе данных».
Затем во время выполнения для пространственного объекта я просто должен вызвать spatialite_init(0)
, чтобы запустить и запустить расширение.
Вызовите такой метод перед загрузкой любой базы данных sqlite.
Надеюсь, это поможет.