原始问题是“我有一个sqlite 3 db(字典),我想在新的应用程序中使用。是否有基于db结构创建核心数据关系模型的捷径?”
这就是我解决问题的方法 - 在整个网络上提供了很多帮助。
我简化了数据库,这使得编写核心数据模型非常容易。
我使用了此great site中的Python脚本来管理转换。
脚本如下:
import sqlite3;
inConn = sqlite3.connect('dictold.sqlite')
outConn = sqlite3.connect('dictnew.sqlite')
inCursor = inConn.cursor()
outCursor = outConn.cursor()
maxId = 0
inCursor.execute("select * from lexicon")
for row in inCursor:
if row[0] > maxId:
maxId = row[0]
# Create ZLEXICONENTITY entry
vals = []
vals.append(row[3]) # Z_PK
vals.append(1) # Z_OPT
vals.append(2) # Z_ENT
vals.append(row[0]) # ZIND
vals.append(row[1]) # ZENGLISH
vals.append(row[2]) # ZGREEK
outConn.execute("insert into ZLEXICONENTITY values(?, ?, ?, ?, ?, ?)", vals)
outConn.execute("update Z_PRIMARYKEY set Z_MAX=?", [maxId])
outConn.commit()
一旦我构建了数据库,我就无法将其连接到Core Data模型。我收到一条消息“模型与数据库不匹配”。
解决方案是让Core Data从模型中创建空数据库,然后让Core Data自行导入数据。
我首先将我的sqlite数据库(用Python创建)导出到sql,调用文件db.sql(imaginative!)。我只导出数据表和主键表,而不是元数据表。您也可以在命令行执行此操作。我使用了一个名为SQLiteManager的应用程序。
核心数据中的所有代码都是库存,除了处理持久存储控制器..
该代码如下:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"db.sql"];
// set up the backing store
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator_;
}
许多人可能都知道这一切,但我不得不坚持几天。也许有更简单的方法可以做到这一点。但也许它会帮助别人......
答案 0 :(得分:1)
没有
核心数据无法从现有架构推断出您的模型,您必须创建模型,然后自行迁移商店。