如何将 sqlite 数据库与 Core Data 同步?
Posted
技术标签:
【中文标题】如何将 sqlite 数据库与 Core Data 同步?【英文标题】:how to synchronize sqlite database with Core Data? 【发布时间】:2015-05-14 09:41:23 【问题描述】:我在应用商店中有一个应用程序,它在本地将数据存储在 sqlite 数据库中。现在我想使用最新版本的核心数据,我怎样才能将 sqlite 数据与核心数据同步并继续使用核心数据的应用程序? 考虑如果用户打开应用程序,那么他的数据应该与 iCloud 数据同步,并且在使用应用程序时不会对用户产生干扰。
【问题讨论】:
在coredata中创建一个simlar schema,并在coredata中迁移sqlite的所有行 【参考方案1】:self.dbManager = [[DBManager alloc] initWithDatabaseFilename:@"revampadhocdb.sql"];
NSString *adhocquery = @"select * from revampadhoctable";
NSArray *adhoctemp = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:adhocquery]];
NSLog(@"adhoc Databse%@",adhoctemp);
//From Adhoc Database fill some data
for (int i=0; i<adhoctemp.count; i++)
DigitalConatct *dgContact=[[DigitalConatct alloc] init];
[dgContact setDgName:[[adhoctemp objectAtIndex:i] objectAtIndex:1]];
[dgContact setBirthDate:[[adhoctemp objectAtIndex:i] objectAtIndex:2]];
[dgContact setContactUrl:[[adhoctemp objectAtIndex:i] objectAtIndex:3]];
[dgContact setDgtype:@"Adhoc"];
[dgContact setDigitalImage:nil];
[dgContact setSubType:@"Person"];
[dgContact setSubTypeName:[[adhoctemp objectAtIndex:i] objectAtIndex:4]];
[dgContact setSubTypeDesc:[[adhoctemp objectAtIndex:i] objectAtIndex:5]];
[dgContact setSummary:[[adhoctemp objectAtIndex:i] objectAtIndex:6]];
[dgContact setDg_ID:[NSNumber numberWithInt:[[[adhoctemp objectAtIndex:i] objectAtIndex:0] intValue]]];
[self insertNewDAObject:dgContact];
#pragma mark insert
- (DAContact *)insertNewDAObject:(DigitalConatct *)daDemo
NSManagedObjectContext *context = [self managedObjectContext];
DAContact *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"DAContact" inManagedObjectContext:context];
newDevice.dgcontact=daDemo;
newDevice.active=[NSNumber numberWithBool:YES];
newDevice.type=daDemo.dgtype;
newDevice.dgname=daDemo.dgName;
// Save the context.
NSError *error = nil;
if (![context save:&error])
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
return newDevice;
在 coredata 中创建一个类似的模式并迁移 coredata 中的所有 sqlite 行。下面是我将所有 revapadhoctable 行迁移到核心数据并手动插入的示例
【讨论】:
【参考方案2】:唯一的办法就是自己动手。如,编写您自己的自定义代码,
从您当前的 SQLite 文件中读取数据 将其写入新的 Core Data 持久存储Core Data 可以使用 SQLite,但其架构与您在 SQLite 文件中使用的架构不同,因此这确实是唯一的方法。
这假设您实际上的意思是将数据从 SQLite 文件一次性移动到 Core Data。这就是您的问题所描述的,即使您的主题行说“同步”。保持数据的两个不同副本同步是一个复杂得多的问题。
【讨论】:
以上是关于如何将 sqlite 数据库与 Core Data 同步?的主要内容,如果未能解决你的问题,请参考以下文章
您将如何最小化或压缩 Core Data sqlite 文件大小?
如何 VACUUM 一个 Core Data SQLite 数据库?
将 Core Data 数据库保存到 sqlite 文件会丢失一些递归/循环关系信息