提问人:Jules 提问时间:7/27/2017 最后编辑:Jules 更新时间:7/28/2017 访问量:174
iOS / SQLite,使用 guid 有效地更新大量 recored?
iOS / SQLite, efficiently updating lots of recoreds with a guid?
问:
我试图找出将(不同的)guid 添加到新字段的最快方法,其中可能有数千条记录。
我很确定SQLite没有提供可以创建guid的函数。因此,我需要以某种方式为每一行创建它。
我提出的想法做得很远。
只需执行字段为空且限制为 1 的更新查询。显然,即使在交易中,这也会很慢。
将 cte(公共表扩展)与临时表一起使用,我在其中构建了包括 guid、更新/联接在内的值。但是,我似乎无法让临时表在 iOS 中工作,我不断收到一个调用序列错误的库。
将内联子查询与更新查询一起使用。但是,我不知道如何识别需要 guid 的行,除了它们是空白的。我需要使用递归,我相信这又需要 cte?
编辑:这是我的解决方案,感谢@CL的想法......
void newguid(sqlite3_context *context, int argc, sqlite3_value **argv)
{
if (argc != 1 || sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
sqlite3_result_null(context);
return;
}
@autoreleasepool {
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
CFRelease(uuid);
sqlite3_result_text(context, [uuidString UTF8String], -1, SQLITE_TRANSIENT);
}
}
- (void)createSqlGuidFunction:(sqlite3*)db
{
if (sqlite3_create_function_v2(db, "newguid", 1, SQLITE_ANY, NULL, &newguid, NULL, NULL, NULL) != SQLITE_OK)
{
NSLog(@"%s: sqlite3_create_function_v2 error: %s", __FUNCTION__, sqlite3_errmsg(db));
}
}
答:
0赞
Malik
7/27/2017
#1
我建议做这样的事情
ALTER TABLE newTable RENAME TO oldTable;
CREATE TABLE newTable (//Define your columns here along with the GUID column);
然后,您可以从 oldTable 中选择所有值,并与 GUID 一起插入到 newTable 中。完成后,使用
DROP TABLE oldTable
评论
0赞
Jules
7/27/2017
SQLite 本身不支持 guid 作为列类型。我在代码中使用 varchar 和我自己的函数来创建 guid。
0赞
Malik
7/27/2017
我知道那件事。我指的是将存储值的列,而不是列的类型GUID column
GUID
0赞
Jules
7/27/2017
那么,我如何在每一行中获得唯一的 guid?我需要运行单独的插入查询吗?这是我提到的性能瓶颈之一。
0赞
Malik
7/27/2017
正确。你将使用循环循环访问结果,并将它们与 guid(将在每次循环迭代时重新创建)一起插入 guid。如果您认为这将是一项成本高昂的操作,也可以考虑运行此过程oldTable
newTable
background queue
0赞
Jules
7/27/2017
谢谢,但我看不出这比我提到的第一种方法更快?此外,我需要在用户可以使用该应用程序之前完成此过程,因此在后台运行无济于事。
1赞
CL.
7/27/2017
#2
文档说
应用程序可以使用此函数以及 hex() 和/或 lower() 生成全局唯一标识符,如下所示:
hex(randomblob(16)) lower(hex(randomblob(16)))
但是,如果要使用其他机制来生成 GUID,则可以注册自己的函数。
评论
0赞
Jules
7/27/2017
谢谢这是解决方案的一部分,但是这不会创建一个唯一的 guid,我认为真正的 guid 基于时间戳并包含连字符。话虽如此,这是一个良好的开端。⭐️ 我也想知道iOS SQLite框架是否支持这一点。
0赞
Jules
7/27/2017
啊,这很有趣 gist.github.com/mmarcon/1323584/......我将进一步研究这个问题,看看我是否能想出一个更好的 guid 实现。我会在几天后回帖。
0赞
Jules
7/28/2017
我已根据您的想法将我的解决方案添加到我的问题中。谢谢。棒!
评论