iOS / SQLite,使用guid高效更新大量的recored?

时间:2017-07-27 06:27:24

标签: ios sql iphone sqlite

我正在试图找出向新字段添加(不同)guid的最快方法,其中可能有数千条记录。

我很确定SQLite不提供会创建guid的函数。所以我需要以某种方式为每一行创建这个。

我想出的想法做得很远。

  1. 只需执行更新查询,其中字段为空并且限制1.显然,即使在交易中,这也会很慢。

  2. 将cte(公用表扩展名)与临时表一起使用,我建立了包括guid,update / join在内的值。但是我似乎无法在iOS中使用临时表,我不断得到一个名为乱序错误的库。

  3. 对更新查询使用内联子查询。但是我不知道如何识别需要guid的行,除了它们是空白的。我需要使用递归,再次需要cte,我相信?

  4. 编辑:这是我的解决方案,归功于@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));
        }
    }
    

2 个答案:

答案 0 :(得分:1)

documentation

  

应用程序可以使用此函数以及hex()和/或lower()生成全局唯一标识符,如下所示:

hex(randomblob(16))

lower(hex(randomblob(16)))

但是如果你想使用不同的机制来生成GUID,你可以register your own function

答案 1 :(得分:0)

我建议做这样的事情

ALTER TABLE newTable RENAME TO oldTable;
CREATE TABLE newTable (//Define your columns here along with the GUID column);

然后,您可以从oldTable中选择所有值,并将其与GUID一起插入newTable。完成后,请使用

DROP TABLE oldTable