【发布时间】:2018-01-02 17:12:27
【问题描述】:
我正在尝试找出将(不同)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));
}
}
【问题讨论】:
-
为什么不在插入行时添加 guid?
-
谢谢@Malik,我正在用我的应用程序的新版本升级我的桌子。我需要 guid 作为我所有表的唯一键,因此我可以将它用于 iCloud/多用户同步。
-
啊!这就说得通了。下面看看我的回答