Rac*_*elD 5 sqlite core-data ios
我的目标是创建一个sqlite数据库并用数据填充(可能超过1000行)并使用此数据库预先加载核心数据,并填充表视图.
到目前为止,我的表视图使用Core Data,Managed Object Models.我可以添加项目和删除项目 - 基本上我有Master-Detail模板工作,但我自己的模型.
问题: 如何以正确的格式创建sqlite数据库以与Core Data一起使用?
我已经使用提供的sql数据库和书籍教程成功完成了这项工作.我注意到的是,我的教程中的表格"逃逸"(例如)在提供的sqlite数据库中写成了"ZFUGITIVE".它的所有列都在前面附加了'Z'('ZFUGITIVEID','ZNAME'...),并且存在三个额外的列('Z_PK','Z_ENT','Z_OPT'),这些列未包含在托管中对象模型(.xcdatamodeld).除了'Z'所有大写名称和额外的列我还看到(在这个带有教程的.sqlite数据库中)有两个额外的表'Z_PRIMARYKEY'和'Z_METADATA'.
我熟悉sqlite终端命令,可以创建一个数据库,但它没有正确的格式,额外的行或带元数据的额外表.我作为一个实验所做的是采用上面的Fugitive sqlite数据库表并添加另一个表.起初我用列'thingID'和'title'称它为'table'.我为它创建了托管对象并将其连接到我的表视图.我无法为我的生活获取数据在核心数据/我的表视图中预加载.我收到了没有错误消息,它只是没有预加载数据(它确实让我添加和删除新项目就像Master-Detail模板一样).
所以我用'('Z_PK','Z_ENT','Z_OPT','ZTHINGID'和'ZTITLE')将表'''重命名为'ZTHING',现在我收到以下错误信息.我知道它告诉我我不正确地创建了我的表但是我无法找到有关如何正确创建它的文档.请帮忙.
这是一个很大的鸣喇叭错误,基本上说明表Z_METADATA(列Z_UUID)中记录的版本号是不正确的:[或者我认为]
Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x5b489c0 {metadata=<CFBasicHash 0x5b4e960 [0x2651380]>{type = immutable dict, count = 7,
entries =>
2 : <CFString 0x5b4ea40 [0x2651380]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x5b4eb10 [0x2651380]>{type = immutable, count = 0, values = ()}
4 : <CFString 0x5b4ea90 [0x2651380]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x5b4e530 [0x2651380]>{value = +248, type = kCFNumberSInt64Type}
6 : <CFString 0x5b4eac0 [0x2651380]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x5b4eba0 [0x2651380]>{type = immutable dict, count = 1,
entries =>
1 : <CFString 0x5b4eb30 [0x2651380]>{contents = "Fugitive"} = <CFData 0x5b4eb50 [0x2651380]>{length = 32, capacity = 32, bytes = 0xe33370b6e7ca3101f91d25951e8bfe01 ... 9e50237bb313d390}
}
7 : <CFString 0x1ee464 [0x2651380]>{contents = "NSStoreUUID"} = <CFString 0x5b4e850 [0x2651380]>{contents = "E711F65F-3C5A-4889-872B-6541E4B2863A"}
8 : <CFString 0x1ee324 [0x2651380]>{contents = "NSStoreType"} = <CFString 0x1ee2e4 [0x2651380]>{contents = "SQLite"}
9 : <CFString 0x5b4ea10 [0x2651380]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x5d0b520 [0x2651380]>{value = +3, type = kCFNumberSInt32Type}
10 : <CFString 0x5b4eaf0 [0x2651380]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x5b4ebf0 [0x2651380]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
metadata = {
NSPersistenceFrameworkVersion = 248;
NSStoreModelVersionHashes = {
Fugitive = <e33370b6 e7ca3101 f91d2595 1e8bfe01 3e7fb4de 6ef2a31d 9e50237b b313d390>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
);
NSStoreType = SQLite;
NSStoreUUID = "E711F65F-3C5A-4889-872B-6541E4B2863A";
"_NSAutoVacuumLevel" = 2;
};
reason = "The model used to open the store is incompatible with the one used to create the store";
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你能给我的所有帮助
Ton*_* K. 14
好的,所以我同意上述评论.使用Core Data构建SQL数据库.如果你直接修改数据库,所有的赌注都取决于苹果对格式的作用; 但是,Apple必须确保向后兼容Core Data,因此他们的API必须转发任何有效的最新格式的内容.
因此,要用真实信息回答您的问题(截至2011年12月和iOS 4,这是正确的),这是一种可行的技术:
让核心数据创建数据库.这是您的模板,将包含正确的元数据和属性.你永远不应该在这上面使用DML(没有alter table等).
Z_ENT列是实体ID,用于跟踪ZPRIMARYKEY表中对象的主键.如果检查主键表,它将跟踪每个实体上已使用的最大ID(用于生成Z_ID).它还跟踪继承,因为核心数据对所有具有继承关系的类使用单个表.例如,Manager是Employee的子类.将有一个表(zemployee),主键表将Z_SUPER设置为指向跟踪表的ID的实际行.如果您有子类,那么Z_ENT将指示该行的正确类型.例如,如果Employee为1且Manager在ZPRIMARYKEY中为2,则ZEMPLOYEE中将有Z_ENT为1和2的行.
Z_OPT列是一行写入的次数(包括插入...因此从1开始).它几乎肯定用于一致性(例如乐观事务并发处理).无论如何,当你写一行时,你应该增加它.
当然,您还应该在主键表中保持MAX字段的最新状态.确保在事务中一起执行insert和PK表更新,这样就不会损坏事物!
最后,当然,你不应该首先这样做:)
我需要知道这一点,因为我需要一个非OSX同步服务器来处理核心数据生成的文件......因此我无法直接使用核心数据API.
更新:2012年9月
关于继承的快速说明.如果您的核心数据模型中的子类具有FK关系,则Core Data使用单表继承模型(在Hibernate文档中查看,以便更好地了解正在发生的事情).单个表将Z_ENT设置为正确的类类型,并且外键可能需要多个列来处理类中存在的替代.确保正确使用的最佳方法是在Objective-C中使用每个类的实例生成一个小数据集,然后使用命令行中的sqlite3转储数据.很明显哪种数据类型使用哪些列.
您无法找到有关如何正确创建文档的文档,因为从Apple的角度来看,您不应该首先自己创建它.如果您需要核心数据模型,则应使用核心数据来创建表而不是自己创建表.
如果要使用数据预先填充表,可以通过编写代码来执行此操作.该代码可以在您的应用程序的启动代码中运行,也可以编写单独的独立应用程序以将数据库填充到文件系统,然后将该数据库文件导入到"真实"项目中.
无论你接近它,你都应该假设使用带有SQlite持久性存储的核心数据意味着你应该让核心数据来处理表的创建.如果你想编写一个基于SQlite的应用程序,你可以自由地这样做,但是Core Data不是你的解决方案.
这是我如何做到的
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
8477 次 |
| 最近记录: |