Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅在Swift中创建自定义sqlite函数_Ios_Sqlite_Swift - Fatal编程技术网

Ios 仅在Swift中创建自定义sqlite函数

Ios 仅在Swift中创建自定义sqlite函数,ios,sqlite,swift,Ios,Sqlite,Swift,如何在Swift中添加自定义sqlite函数 以下SO问题解决了在涉及坐标的sqlite查询中使用acos和cos等函数的问题: 建议添加一个自定义函数。但是Objective-C中给出了该示例。除了桥接到Objective-C之外,是否有允许创建自定义函数的本机Swift函数或库?为提供了类型安全的Swift接口(免责声明:我编写并维护了SQLite.Swift)。当前版本在内部连接到Objective-C,尽管这是一个可以忽略的实现细节。未来的版本可能会使用Swift 2的函数指针API。

如何在Swift中添加自定义sqlite函数

以下SO问题解决了在涉及坐标的sqlite查询中使用acos和cos等函数的问题:

建议添加一个自定义函数。但是Objective-C中给出了该示例。除了桥接到Objective-C之外,是否有允许创建自定义函数的本机Swift函数或库?

提供了类型安全的Swift接口(免责声明:我编写并维护了SQLite.Swift)。当前版本在内部连接到Objective-C,尽管这是一个可以忽略的实现细节。未来的版本可能会使用Swift 2的函数指针API。虽然可以在Swift 1.x中使用C函数指针和一些
@objc_block
unsafeBitCast
,但读取和维护起来要糟糕得多

创建
cos
函数的最基本方法:

import SQLite
import Darwin

// opens a database connection
let db = Database()

// defines a "cos" function on the connection 
db.create(function: "cos", argc: 1, deterministic: true) { args in
    if let x = args[0] as? Double {
        return Darwin.cos(x)
    }
    return nil
}

println(db.scalar("SELECT cos(1.0)"))
// Optional(0.54030230586813977)
一个更复杂、更安全的示例,其中SQLite.swift在给定契约的情况下生成数据库的类型安全接口:

import SQLite
import Darwin

// opens a database connection
let db = Database()

// defines a "cos" function on the connection 
let cos: Expression<Double> -> Expression<Double> = (
    db.create(function: "cos", deterministic: true, Darwin.cos)
)

// builds a SQL expression for the column, "x"
let x = Expression<Double>("x")

// creates a query reference for the table, "table"
let table = db["table"]

// creates the table
db.create(table: table) { t in
    t.column(x)
}
// CREATE TABLE "table" ("x" REAL)

// inserts a row where "x" is 1.0
table.insert(x <- 1.0)
// INSERT INTO "table" ("x") VALUES (1.0)

// executes the query
for row in db.select(cos(x)) {
    println(row[cos(x)])
}
// SELECT "cos"("x") FROM "table"
导入SQLite 导入达尔文 //打开数据库连接 设db=Database() //在连接上定义一个“cos”函数 让cos:Expression->Expression=( create(函数:“cos”,确定性:true,Darwin.cos) ) //为列“x”生成SQL表达式 设x=表达式(“x”) //为表“table”创建查询引用 let table=db[“table”] //创建表 db.create(table:table){t in t、 第(x)列 } //创建表格“表格”(“x”实际值) //插入“x”为1.0的行 表.insert(x为提供了一个类型安全的Swift接口(免责声明:我编写并维护了SQLite.Swift)。当前版本在内部连接到Objective-C,尽管这是一个可以忽略的实现细节。未来的版本可能会使用Swift 2的函数指针API。虽然您可以在Swift 1.x中使用带有一些
@objc_block
unsafeBitCast
的C函数指针,但阅读和维护起来要差得多艾因

创建
cos
函数的最基本方法:

import SQLite
import Darwin

// opens a database connection
let db = Database()

// defines a "cos" function on the connection 
db.create(function: "cos", argc: 1, deterministic: true) { args in
    if let x = args[0] as? Double {
        return Darwin.cos(x)
    }
    return nil
}

println(db.scalar("SELECT cos(1.0)"))
// Optional(0.54030230586813977)
一个更复杂、更安全的示例,其中SQLite.swift在给定契约的情况下生成数据库的类型安全接口:

import SQLite
import Darwin

// opens a database connection
let db = Database()

// defines a "cos" function on the connection 
let cos: Expression<Double> -> Expression<Double> = (
    db.create(function: "cos", deterministic: true, Darwin.cos)
)

// builds a SQL expression for the column, "x"
let x = Expression<Double>("x")

// creates a query reference for the table, "table"
let table = db["table"]

// creates the table
db.create(table: table) { t in
    t.column(x)
}
// CREATE TABLE "table" ("x" REAL)

// inserts a row where "x" is 1.0
table.insert(x <- 1.0)
// INSERT INTO "table" ("x") VALUES (1.0)

// executes the query
for row in db.select(cos(x)) {
    println(row[cos(x)])
}
// SELECT "cos"("x") FROM "table"
导入SQLite 导入达尔文 //打开数据库连接 设db=Database() //在连接上定义一个“cos”函数 让cos:Expression->Expression=( create(函数:“cos”,确定性:true,Darwin.cos) ) //为列“x”生成SQL表达式 设x=表达式(“x”) //为表“table”创建查询引用 let table=db[“table”] //创建表 db.create(table:table){t in t、 第(x)列 } //创建表格“表格”(“x”实际值) //插入“x”为1.0的行
table.insert(x以下是Swift 4示例,说明如何使用返回大写字符串的1个参数将闭包绑定到SQLite函数中:

sqlite3_create_function(db, "utf8_upper".cString(using: .utf8), 1, SQLITE_UTF8, nil, { context, argc, arguments in
    let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
    let argv = Array(UnsafeBufferPointer(start: arguments, count: Int(argc)))
    let param = String(cString: UnsafePointer(sqlite3_value_text(argv[0])))
    let result = param.uppercased()
    return sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT)
}, nil, nil)

下面是一个Swift 4示例,说明如何使用1个参数将闭包绑定到SQLite函数中,该参数返回大写字符串:

sqlite3_create_function(db, "utf8_upper".cString(using: .utf8), 1, SQLITE_UTF8, nil, { context, argc, arguments in
    let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
    let argv = Array(UnsafeBufferPointer(start: arguments, count: Int(argc)))
    let param = String(cString: UnsafePointer(sqlite3_value_text(argv[0])))
    let result = param.uppercased()
    return sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT)
}, nil, nil)

快速跟进的是,在您的示例中,创建了一个新的db…我理解这一点。我理解一旦有了db,如何对其进行操作。但我有一个现有的sqlite3文件。用于该文件的db.open命令是什么(沿着db create的行)…换句话说,我如何使db等于该文件(或引用它)这样我就可以添加cos函数并开始处理数据了?谢谢!@JackAmoratis您可以直接将路径传递给初始值设定项。请参阅此处的说明:我喜欢这个答案,我觉得它是最有帮助的…但我无法验证它,因为我无法使用github repo上的手动安装说明使模块正常工作你链接到了。我已经尝试了2个小时,卸载、重新安装、重新启动XCode。我猜这是次要的(通常是,对吧?!)你最近看过你的手动安装说明了吗?谢谢。@JackAmoratis我最近用同样的说明安装了它,它们应该可以工作。如果你仍然有问题,试试CocoaPods。问题似乎是…我下载了repo作为zip文件,并将其解压缩到我的下载目录中。我从那里拖入了projectfile,而且永远不会一切正常。但从长远来看,这是站不住脚的。所以我通过Finder将其复制到项目中,然后将项目文件新拖到现有项目中。这就是错误产生的地方。快速跟进是,在您的示例中,创建了一个新的db…我理解这一点。我理解一旦有了db,如何对其进行操作。但我必须e一个现有的sqlite3文件。该文件的db.open命令是什么(沿着db create的行)…换句话说,我如何使db等于该文件(或引用它)这样我就可以添加cos函数并开始处理数据了?谢谢!@JackAmoratis您可以直接将路径传递给初始值设定项。请参阅此处的说明:我喜欢这个答案,我觉得它是最有帮助的…但我无法验证它,因为我无法使用github repo上的手动安装说明使模块正常工作你链接到了。我已经尝试了2个小时,卸载、重新安装、重新启动XCode。我猜这是次要的(通常是,对吧?!)你最近看过你的手动安装说明了吗?谢谢。@JackAmoratis我最近用同样的说明安装了它,它们应该可以工作。如果你仍然有问题,试试CocoaPods。问题似乎是…我下载了repo作为zip文件,并将其解压缩到我的下载目录中。我从那里拖入了projectfile,而且永远不会一切正常。但从长远来看,这是站不住脚的。所以我通过Finder将其复制到项目中,然后新将项目文件拖到现有项目中。这就是错误产生的地方。完美答案。我一直在寻找这个,但找不到。谢谢!!!这应该是正确答案。完美答案。我一直在寻找这个找不到。谢谢!!!这应该是co