根据关于调试Core Data的Apple文档,它说我们应该能够将一个参数传递给应用程序,该应用程序将输出SQL核心数据发送给SQLite.
我已经进入XCode中我的可执行文件的参数选项卡并指定了参数:
-com.apple.CoreData.SQLDebug 1
Run Code Online (Sandbox Code Playgroud)
但是,我在控制台中看不到SQL.然后我尝试在Apple提供的CoreDataBooks应用程序中使用此参数,以防我的程序中出现其他问题.
即使在Apple的示例中,我在控制台中也没有输出SQL.
难道我做错了什么?Apple的文档错了吗?我应该寻找控制台以外的其他地方吗?有没有其他人在这个论点上取得成功?
更新: Apple已经修复了新版XCode的输出错误; 但是,要明确最终的解决方案:
参数是两个单独的参数,应该在参数选项卡中输入.-com.apple.CoreData.SQLDebug是一个参数,值1是第二个参数.
有谁知道如何获取一些结果按字母顺序排序但忽略大小写?
如何在使用Core Data SQL Debug时打印发送到sqlite数据库的值?
在我的" 启动时传递的参数 "调试选项中使用" -com.apple.CoreData.SQLDebug 1 " 打印SQL结构就好了
(你可以在这里查看如何使用它:XCode4和核心数据:如何启用SQL调试)
但问题是,UPDATE ZTABLE SET ZCOLUMN = ? WHERE ZID = ?如果您正在尝试查看发送到数据库的完整SQL语句和/或数据,那么打印的NSLog就像是一样,它根本没用.
我是Core Data的新手,因此我不确定我是否犯了错误.我从REST API下载了一些数据,并成功将JSON响应保存到磁盘.我正在尝试处理数据并使用Core Data持久保存数据.
NSLog(@"inserted objects: %@", [managedObjectContext insertedObjects]);
[managedObjectContext performBlockAndWait:^{
NSError *error = nil;
if (![managedObjectContext save:&error]) {
NSLog(@"Unable to save context for class %@", className);
} else {
NSLog(@"saved all records!");
}
}];
Run Code Online (Sandbox Code Playgroud)
我已成功处理JSON并将其添加到NSManagedObjectContext.在第一行中,它显示我已成功尝试插入2个对象.
inserted objects: {(
<User: 0xa259af0> (entity: User; id: 0xa259b70 <x-coredata:///User/t44BB97D0-C4B4-4BA6-BD25-13CEFDAE665F3> ; data: {
email = "vishnu@vishnuprem.com";
experience = "2013-07-20";
"first_name" = Vishnu;
id = 2;
"job_title" = Developer;
"last_name" = Prem;
location = "";
"phone_number" = "+6590091516";
"profile_pic" …Run Code Online (Sandbox Code Playgroud) 我有一个适用于iPad的现成企业(非AppStore)遗留iOS应用程序,我需要重构(它是由另一个开发人员,我的前任在我目前的工作中编写的).
此应用程序通过JSON从具有MSSQL数据库的服务器获取其数据.数据库模式有大约30个表,最广泛的是:客户端,城市,代理每个都有大约10,000个记录,并且预计将来会进一步增长.收到JSON后(每个表的一个JSON请求和响应对) - 它被映射到CoreData - 该过程还包括将相应的CoreData实体(客户端,城市,代理和其他)相互粘合在一起,即在CoreData层上设置这些实体之间的关系.
本项目的CoreData fetch-part(或读取部分)本身已经过大量优化 - 我猜,它使用了几乎所有可能的性能和内存调整CoreData,这就是为什么UI层的应用程序非常快速和响应,所以我认为其工作完全令人满意和充分.
问题是准备CoreData层的过程,即服务器到客户端的同步过程:它需要花费太多时间.考虑30个网络请求,产生30个JSON包("pack"我的意思是"一个表 - 一个JSON"),然后映射到30个CoreData实体,然后将它们粘合在一起(在它们之间设置适当的CoreData关系).当我第一次看到在这个项目中完成所有这些工作(太慢)时,我想到的第一个想法是:
"第一次执行完全同步(应用程序的第一次启动时间) - 在一个存档文件(例如数据库转储)中执行整个数据库数据的获取,然后以某种方式将其作为整体导入到核心数据土地".
但后来我意识到,即使这样的单文件转储的传输是可能的,CoreData仍然需要我执行相应的CoreData实体的粘合来设置它们之间的适当关系,以便很难想象我能够如果我依赖这个计划,我会在表现上受益.
另外,我的同事建议我将SQLite视为核心数据的完全替代品,但遗憾的是我没有使用它的经验,这就是为什么我完全无法预见这种严肃的设计决策的所有后果(即使是同步过程非常慢,我的应用程序确实有效,特别是它的UI性能现在非常好).关于SQLite,我唯一可以想象的是,与Core Data相比,它不会促使我在客户端粘合一些额外的关系,因为SQLite有其良好的旧外键系统,不是吗?
所以这里有一些问题(受访者,请不要在回答时混淆这些要点 - 我对所有问题都有太多困惑):
是否有人以上述方式对"首次大量导入整个数据库"方法有这样的经验?如果他们利用JSON < - > CoreData对,我会非常感谢知道任何解决方案.
Core Data是否具有一些全局导入机制,可以允许大量创建相应的30-table-schema(可能使用上述"30包JSON"之外的某些特定源),而无需为30个实体设置相应的关系?
如果2)不可能,是否有可能加快同步过程?这里我指的是我的应用程序使用的当前JSON < - > CoreData方案的改进.
迁移到SQLite:我应该考虑这样的迁移吗?我会从中受益吗?整个复制过程 - >传输 - >客户端准备工作如何?
CoreData和SQLite的其他替代品 - 它们可能是什么样子?
您对我所描述的情况有任何其他想法或想法吗?
更新1
虽然Mundi写的答案很好(一个大的JSON,使用SQLite的"No"),但我仍然对如何对我所描述的问题有任何其他见解感兴趣.
更新2
我确实尝试用我的俄语英语以最好的方式描述我的情况,希望我的问题可以变得非常清楚,每个人都会阅读它.通过第二次更新,我将尝试为其提供更多指南,以使我的问题更加清晰.
请考虑两个二分法:
我认为通过这两个二分法的交集形成的"扇区"非常明显,从第一个选择CoreData而第二个选择JSON是iOS开发世界中最广泛的默认值,并且我的应用程序使用它从这个问题.
话虽如此,我声称我会感谢看到有关CoreData-JSON对的任何答案以及考虑使用任何其他"扇区"的答案(如何选择SQLite和某种转储方法,为什么不呢?)
另外,需要注意的是,我不想只删除其他选项的当前选项,我只想让解决方案在其使用的同步和UI阶段快速运行.所以欢迎关于改进现有方案的答案以及建议其他方案的答案!
现在,请参阅以下更新#3,其中提供了有关当前CoreData-JSON情况的更多详细信息:
更新3
正如我所说,目前我的应用程序收到30包JSON - 整个表的一个包.让我们以宽大的表格为例:客户,代理商,城市.
它是Core Data,所以如果一个client记录有非空 …
这很有趣.在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用MagicalRecord).一切似乎都很好(从背景/前景/上下文的角度来看).
当在主线程中,我尝试获取"刚插入"的数据时,我发现了以下行为:
- (NSArray *) familiesInCompany:(Company *) company {
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];
NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];
return second;
}
Run Code Online (Sandbox Code Playgroud)
现在我得到的是:
Family对象,如预期的那样通过调试SQL语句,我得到以下内容:
"第一"声明:
CoreData:注释:总获取执行时间:0行为0.0000s.
"第二个"声明":
CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZNAME,t0.ZCOMPANY FROM ZFAMILY t0 JOIN ZCOMPANY t1 ON t0.ZCOMPANY = t1.Z_PK WHERE t1.ZNAME =?ORDER BY t0.ZNAME
CoreData:annotation:sql连接获取时间:0.0005s
CoreData:注释:总获取执行时间:2行0.0007秒.
"第三"声明: …
需要帮忙.
我的桌子上有4个字段:
我想选择电子邮件,消息(最近),date_received和未读消息的总和
这是我的预期结果:
test@email.com | 测试消息| 2015-02-27 | 28 test2@email.com | 测试Message2 | 2015-02-29 | 2
这是我目前的代码:
let fetchRequest:NSFetchRequest = NSFetchRequest()
if let entityDescription:NSEntityDescription = NSEntityDescription.entityForName("Message", inManagedObjectContext: managedObjectContext){
fetchRequest.entity = entityDescription
}
fetchRequest.propertiesToFetch = ["email","message","read","date_received"]
fetchRequest.propertiesToGroupBy = ["email"]
fetchRequest.resultType = .DictionaryResultType
fetchRequest.returnsObjectsAsFaults = false
let items:NSArray = managedObjectContext .executeFetchRequest(fetchRequest, error: nil)!
Run Code Online (Sandbox Code Playgroud)
输出:
20 18:24:51.639 JPtxt[33368:1345477] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'SELECT clauses in queries with GROUP BY components can only contain …Run Code Online (Sandbox Code Playgroud) 我的iPhone应用程序有一个Words具有属性的实体word,length和language.两者都被编入索引:

我将cdatamodel和数据库复制到一个单独的导入器应用程序,在该应用程序中预先填充了大约400,000个不同语言的单词.我通过查看SQLite文件验证了导入,然后将预填充的数据库复制回iPhone项目.
首先,我认为(简单)谓词是问题所在.但即使从获取请求中删除谓词,也需要很长时间才能执行:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
Run Code Online (Sandbox Code Playgroud)
这是我的代码的样子:
// Get word
NSLog(@"Start");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//... error handling code
}
[fetchRequest release];
NSLog(@"End");
return fetchedObjects;
Run Code Online (Sandbox Code Playgroud)
数据库中的条目数是Core Data的问题吗?
编辑:正如gcbrueckmann和jrturton指出的那样,这是一个很好的设置点fetchBatchSize.但是获取时间仍然不尽如人意:
谓词集2秒:
NSPredicate*predicate = [NSPredicate predicateWithFormat:@"length ==%d AND language BEGINSWITH%@",wordLength,lng]; [fetchRequest setPredicate:predicate]; …
此代码引发"CoreData:error:(19)PRIMARY KEY必须是唯一的"错误.该Day实体只有一个when属性,它是一个NSDate,而被称为一对多的关系tasks.为什么这个错误?如果Day已经存储了具有特定日期的,我会获取它,否则我会插入它.因此,对于每天的对象,应该有不同的when属性.我不确定这是否是主键.怎么解决这个?先感谢您.
NSMutableSet *occurrences = nil;
occurrences = ...
NSMutableOrderedSet *newSet = [NSMutableOrderedSet orderedSetWithCapacity:[occurrences count]];
for(NSDate *current in occurrences) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// try to find a corresponding Day entity whose when attribute is equal to the current occurrence
// if none is available, create it
Day * day = [[self getDayForDate:current inManagedObjectContext:moc] retain];
if(!day){
day = (Day *) [NSEntityDescription insertNewObjectForEntityForName:@"Day" inManagedObjectContext:moc];
}
day.when …Run Code Online (Sandbox Code Playgroud) 在XCode Instruments应用程序中,有一个Core Data Saving仪器.它可以显示每个Core Data保存的"保存持续时间".它用于保存持续时间的单位是多少?由于没有人类可察觉的滞后时间,我看到读数从67到6343不等.
这是微秒,与处理器周期有关的东西,还是仪器采样时间的倍数?
像许多iOS开发人员一样,我使用CoreData,就像许多使用CoreData的iOS开发人员一样,我有很难跟踪线程违规错误.我正在尝试实现一个调试策略,以便在CoreData并发规则被破坏时抛出异常.我的尝试在下面 - 我的问题是,这有效吗?它会产生误报吗?
简介:创建NSManagedObject时,请记下该线程.每当稍后访问某个值时,检查当前线程是否与创建线程相同,如果没有,则抛出异常.
#import "NSManagedObject+DebugTracking.h"
#import "NSObject+DTRuntime.h"
#import <objc/runtime.h>
#import "NSManagedObjectContext+DebugThreadTracking.h"
@implementation NSManagedObject (DebugTracking)
+(void)load {
[NSManagedObject swizzleMethod:@selector(willAccessValueForKey:) withMethod:@selector(swizzled_willAccessValueForKey:)];
[NSManagedObject swizzleMethod:@selector(initWithEntity:insertIntoManagedObjectContext:) withMethod:@selector(swizzled_initWithEntity:insertIntoManagedObjectContext:)];
}
- (__kindof NSManagedObject *)swizzled_initWithEntity:(NSEntityDescription *)entity
insertIntoManagedObjectContext:(NSManagedObjectContext *)context
{
NSManagedObject *object = [self swizzled_initWithEntity:entity insertIntoManagedObjectContext:context];
NSLog(@"Initialising an object of type: %@", NSStringFromClass([self class]));
object.debugThread = [NSThread currentThread];
return object;
}
-(void)swizzled_willAccessValueForKey:(NSString *)key {
NSThread *thread = self.debugThread;
if (!thread) {
NSLog(@"No Thread set");
} else if (thread != [NSThread currentThread]) {
[NSException raise:@"CoreData thread violation exception" format:@"Property …Run Code Online (Sandbox Code Playgroud)