【问题标题】:Set auto increment in Core data iOS在核心数据 iOS 中设置自动增量
【发布时间】:2014-08-15 21:19:23
【问题描述】:

我正在使用 Core Data,并希望将 auto_increment ID 设置为唯一的字段之一。是否可以使用核心数据在 iOS 中设置 auto_increment?谁能帮我举个小例子来说明如何实现这个?

下面是我在数据库中插入记录的代码。在第一个字段“id”中,我想将其设置为 auto_increment 而不是手动插入。

- (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}

NSManagedObjectContext *context = [self managedObjectContext];

// Create a new managed object
NSManagedObject *newObj = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:context];

[newObj setValue:[NSNumber numberWithInt:userId] forKey:@"id"];
[newObj setValue:theFileName forKey:@"Name"];

【问题讨论】:

  • 你能分享一个你迄今为止尝试过的例子吗?
  • 我检查了上面的链接,它创建了唯一 ID,但不是 auto_increment。核心数据有没有类似于 MySQl 中的 auto_increment 的东西?
  • 为什么需要自动增量属性?大多数情况下,在 mysql 中,它用于获取唯一键 - 在 coredata 中,将自动管理唯一 id (objectID)
  • 如果您想通过创建添加属性存储日期或 unix 时间戳来对对象进行排序。如果您希望已经为您处理的对象核心数据的唯一性 - 请阅读 stackoverflow.com/questions/1351998/…

标签: ios core-data xcode5 auto-increment nsmanagedobject


【解决方案1】:

Core Data 没有自动增量功能。事实上,它在内部使用 SQLite 几乎是无关紧要的——如果你专注于类似 SQL 的细节,你就会让 Core Data 大错特错。

如果你想要一个递增的字段,你必须自己管理它。您可以将当前值保存在应用的NSUserDefaults 中。或者,您可以将它放在 Core Data 使用的持久存储文件的元数据中(参见 NSPersistentStoreCoordinator 上的方法)。两者都可以,只要确保在创建新对象时查找、递增并重新保存即可。

但您可能不需要此字段。 Core Data 已经为每个托管对象处理了唯一的 ID——请参阅 NSManagedObjectID

【讨论】:

  • 其实我这里可以想到一个用例。如果您试图在应用程序启动之间跟踪某个 Core Data 对象,那么 NSManagedObjectID 是不可靠的,因为它可能会发生变化(例如,在数据迁移之后)。因此,您需要为此创建自己的唯一标识符,在这种情况下,自动递增 ID 或类似的选择是一个合理的选择。
  • 这就是我说“可能”的原因。自动增量仍然可能不是一个好主意,因为任何同步其数据(现在或将来)的应用程序都存在重复的风险。如果需要唯一 ID,UUID 可能会更安全。
  • 如果这就是您说“可能”的原因,那么您应该继续提及它。对于可能依赖NSManagedObjectID 认为它是应用程序启动之间的持久 ID 的任何人来说,这是一个有用的实现细节。不过,我同意你关于 AutoIncrement 的看法——出于同样的原因,我们最终也使用了 UUID。
  • 我只回答了一个问题,没有详细讨论 Core Data 中唯一 ID 的所有可能用途以及 NSManagedObjectID 的全部含义。我的回答解释了如何实现问题中所述的目标。
  • 为什么您可能更喜欢自动递增的 int ID 而不是 UUID ID 的一个新颖示例是使值更易于用户呈现。例如,如果您想通过深层链接公开数据。比如my-app://open/note/12 vs my-app://open/note/HORRIBLE-LOOKING-UUID-STRING
【解决方案2】:

这是您可以做的事情,但在保存条目后 所以确保在你得到之前调用 saveContext() 否则你总是会得到零

目标-C

- (int)getAutoIncrement:(InAppMessage*)inApp {
    int number = 0;
    NSURL *url = [[inApp objectID] URIRepresentation];
    NSString *urlString = url.absoluteString
    NSString *pN = [[urlString componentsSeparatedByString:@"/"] lastObject];
    if ([pN containsString:"p"]){
        NSString *stringPart = [pN stringByReplacingOccurrencesOfString:@"p" withString:@""]
        number = stringPart.intValue
    }
    url = nil;
    urlString = nil;
    pN = nil;
    stringPart = nil;
    return number;
}

斯威夫特:

func getAutoIncremenet() -> Int64   {
    let url = self.objectID.uriRepresentation()
    let urlString = url.absoluteString
    if let pN = urlString.components(separatedBy: "/").last {
        let numberPart = pN.replacingOccurrences(of: "p", with: "")
        if let number = Int64(numberPart) {
            return number
        }
    }
    return 0
}

【讨论】:

  • 嗨,这个getAutoIncremenet()真的可靠吗?
  • 这里面的objectID是什么?
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 2011-09-16
  • 2014-11-16
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多