相关疑难解决方法(0)

如何将CoreData Debug参数输出到控制台?

根据关于调试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是第二个参数.

sqlite iphone debugging cocoa core-data

33
推荐指数
2
解决办法
1万
查看次数

31
推荐指数
3
解决办法
8530
查看次数

如何打印Core Data调试值?

如何在使用Core Data SQL Debug时打印发送到sqlite数据库的值?

在我的" 启动时传递的参数 "调试选项中使用" -com.apple.CoreData.SQLDebug 1 " 打印SQL结构就好了

(你可以在这里查看如何使用它:XCode4和核心数据:如何启用SQL调试)

但问题是,UPDATE ZTABLE SET ZCOLUMN = ? WHERE ZID = ?如果您正在尝试查看发送到数据库的完整SQL语句和/或数据,那么打印的NSLog就像是一样,它根本没用.

sqlite debugging core-data ios

17
推荐指数
1
解决办法
4189
查看次数

核心数据不会持久保存对象

我是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)

core-data objective-c ios ios6

17
推荐指数
3
解决办法
2万
查看次数

通过JSON改进将服务器数据库镜像到客户端数据库的过程?

我有一个适用于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有其良好的旧外键系统,不是吗?


所以这里有一些问题(受访者,请不要在回答时混淆这些要点 - 我对所有问题都有太多困惑):

  1. 是否有人以上述方式对"首次大量导入整个数据库"方法有这样的经验?如果他们利用JSON < - > CoreData对,我会非常感谢知道任何解决方案.

  2. Core Data是否具有一些全局导入机制,可以允许大量创建相应的30-table-schema(可能使用上述"30包JSON"之外的某些特定源),而无需为30个实体设置相应的关系?

  3. 如果2)不可能,是否有可能加快同步过程?这里我指的是我的应用程序使用的当前JSON < - > CoreData方案的改进.

  4. 迁移到SQLite:我应该考虑这样的迁移吗?我会从中受益吗?整个复制过程 - >传输 - >客户端准备工作如何?

  5. CoreData和SQLite的其他替代品 - 它们可能是什么样子?

  6. 您对我所描述的情况有任何其他想法或想法吗?


更新1

虽然Mundi写的答案很好(一个大的JSON,使用SQLite的"No"),但我仍然对如何对我所描述的问题有任何其他见解感兴趣.


更新2

我确实尝试用我的俄语英语以最好的方式描述我的情况,希望我的问题可以变得非常清楚,每个人都会阅读它.通过第二次更新,我将尝试为其提供更多指南,以使我的问题更加清晰.

请考虑两个二分法:

  1. 我可以/应该在iOS客户端上使用什么作为数据层 - CoreData vs SQLite?
  2. 我可以/应该使用什么作为传输层 - JSON(答案中建议单一JSON一次,甚至可以压缩)或者一些DB-dump-dumps(如果有可能的话,当然 - 请注意我是在我的问题中也问这个问题).

我认为通过这两个二分法的交集形成的"扇区"非常明显,从第一个选择CoreData而第二个选择JSON是iOS开发世界中最广泛的默认值,并且我的应用程序使用它从这个问题.

话虽如此,我声称我会感谢看到有关CoreData-JSON对的任何答案以及考虑使用任何其他"扇区"的答案(如何选择SQLite和某种转储方法,为什么不呢?)

另外,需要注意的是,我不想只删除其他选项的当前选项,我只想让解决方案在其使用的同步和UI阶段快速运行.所以欢迎关于改进现有方案的答案以及建议其他方案的答案!

现在,请参阅以下更新#3,其中提供了有关当前CoreData-JSON情况的更多详细信息:


更新3

正如我所说,目前我的应用程序收到30包JSON - 整个表的一个包.让我们以宽大的表格为例:客户,代理商,城市.

它是Core Data,所以如果一个client记录有非空 …

json core-data ios

16
推荐指数
4
解决办法
1582
查看次数

如何记录CoreData SQL查询?

我想知道是否有在CoreData中记录SQL查询的选项?

sql logging core-data ios

9
推荐指数
1
解决办法
2761
查看次数

NSPredicate未执行

这很有趣.在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用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秒.

"第三"声明: …

sqlite core-data nspredicate ios magicalrecord

8
推荐指数
1
解决办法
2632
查看次数

IOS Swift Core Data如何在不属于propertiesToGroupBy的propertiesToFetch中添加字段

需要帮忙.

我的桌子上有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)

group-by core-data ios swift

8
推荐指数
1
解决办法
2237
查看次数

简单的核心数据提取非常慢

我的iPhone应用程序有一个Words具有属性的实体word,lengthlanguage.两者都被编入索引: 实体和属性

我将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]; …

iphone performance core-data

7
推荐指数
1
解决办法
7326
查看次数

为什么这段代码会引发"CoreData:error:(19)PRIMARY KEY必须是唯一的"错误?

此代码引发"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)

iphone core-data ipad ios

6
推荐指数
2
解决办法
5943
查看次数

Core Data Saving仪器中"保存持续时间"的单位是多少?

在XCode Instruments应用程序中,有一个Core Data Saving仪器.它可以显示每个Core Data保存的"保存持续时间".它用于保存持续时间的单位是多少?由于没有人类可察觉的滞后时间,我看到读数从67到6343不等.

这是微秒,与处理器周期有关的东西,还是仪器采样时间的倍数?

xcode core-data xcode-instruments

4
推荐指数
1
解决办法
582
查看次数

这是调试CoreData并发问题的有效方法吗?

像许多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)

core-data objective-c ios

3
推荐指数
1
解决办法
841
查看次数