我的datamodel中有一个实体,其字符串属性当前是可选的,我想将其转换为必需属性,其默认值为空字符串.
正如其他人发现的那样,在Xcode CoreData数据建模器中将默认值保留为空会导致验证错误(因为设计者将此解释为NULL),但尝试使用'',""或@""作为默认值会导致这些文字根据需要,字符被解释为默认字符,而不是空的零长度字符串.
我确实在谷歌上发现了这个帖子,但是,除了解决方案真的很丑陋(模型定义在.xcdatamodel和objc源之间拆分)之外,它也不适用于轻量级迁移,因为这些迁移完全基于.xcdatamodel文件和实体实现中的objc逻辑未加载.
有没有办法在数据模型设计师中实现这一目标?
这里有很多类似的问题,但我认为没有一个问题特别提出这个问题,也就是说,代码中是否有任何方法强制红色删除按钮出现在UITableView行的右侧?
我问的原因是我试图使用两个UISwipeGestureRecognizers来改变tableview的行为,这样:
单指滑动会调用自定义操作(而不是显示红色删除按钮,这就是它现在的行为方式),以及
双指滑动调用默认的单指滑动行为,即使红色删除按钮显示.
我已经浏览了SDK文档,但我找不到任何导致红色按钮出现的方法,这让我觉得如果不从头开始手动创建红色删除按钮并尝试制作上面提出的UI方案是不可能实现的它模仿内置的行为.
任何帮助深表感谢.
我正在为基于CoreData的应用程序实现手动触发的迁移过程,并且在迁移成功完成后,我正在尝试将迁移的数据库移回原始数据库的顶部replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
.
问题是在iOS上,我没有做任何事情会使这个方法返回YES,但是它也永远不会在错误指针中添加任何东西,以便让你看到出了什么问题.
我在其他地方读过的东西(例如http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html)表明没有关闭所有的CoreData尝试替换之前的对象(例如NSMigrationManager,NSManagedObjectModel等)可能是原因,但事实并非如此.我甚至实现了一个两个文件创建和交换的东西,它根本不涉及CoreData DB,以验证CoreData的东西与它没有任何关系.
然后我在官方文档中注意到newitemURL
应该在一个被认为适合临时文件的目录中.我认为这意味着URLForDirectory:inDomain:appropriateForURL:create:error:
使用NSItemReplacementDirectory
作为搜索路径返回的目录.
这也不起作用!我最终回到使用单独的操作实现替换逻辑,但这是非原子的,不安全的,所有这些都是坏事.
有没有人有一个在iOS上运行的代码片段,它可以从调用返回YES replaceItemAtURL
或者实际将错误信息放入错误指针中?
任何帮助非常感谢.
编辑 - 测试代码包括在下面.这在application:didFinishLaunchingWithOptions:
主线程上运行.
NSFileManager *fm = [[NSFileManager alloc] init];
NSError *err = nil;
NSURL *docDir = [NSURL fileURLWithPath:[self applicationDocumentsDirectory]];
NSURL *tmpDir = [fm URLForDirectory:NSItemReplacementDirectory
inDomain:NSUserDomainMask
appropriateForURL:docDir
create:NO
error:&err];
NSURL *u1 = [docDir URLByAppendingPathComponent:@"f1"];
NSURL *u2 = [tmpDir URLByAppendingPathComponent:@"f2"];
NSURL *repl = nil;
[fm createFileAtPath:[u1 path]
contents:[[NSString stringWithString:@"Hello"]
dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
[fm createFileAtPath:[u2 path]
contents:[[NSString stringWithString:@"World"]
dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil]; …
Run Code Online (Sandbox Code Playgroud) 正如在SO上的其他问题中所报告的那样,iOS 5根据此发行说明更改了拆分视图控制器的旋转回调的发送方式.这不是一个骗局(我认为),因为我无法找到关于如何在iOS 5中调整拆分视图控制器使用以应对更改的另一个问题:
iOS 5中的旋转回调不适用于通过全屏显示的视图控制器.这意味着,如果你的代码呈现了另一个视图控制器视图控制器,然后用户随后旋转设备,以不同的取向,在解雇,底层控制器(即呈现控制器)将不会收到任何旋转回调.但请注意,呈现控制器在重新显示时将接收viewWillLayoutSubviews调用,并且可以从此方法查询interfaceOrientation属性并用于正确布局控制器.
我在根分割视图控制器中配置弹出窗口按钮时遇到问题(当你在肖像中时,应该在弹出框中显示左窗格视图).以下是当设备处于横向模式时,我的应用启动序列在iOS 4.x中的工作方式:
将拆分视图控制器安装到窗口中[window addSubview:splitViewController.view]; [window makeKeyAndVisible];
.这导致在splitViewController:willHideViewController:withBarButtonItem:forPopoverController:
委托上调用(即模拟横向 - >纵向旋转),即使设备已处于横向模式.
呈现全屏模式(我的加载屏幕),它完全覆盖下面的分割视图.
完成加载并关闭加载屏幕模式.由于设备处于横向模式,因此在显示分割视图控制器时,这会导致splitViewController:willShowViewController:invalidatingBarButtonItem:
在代理上调用(即模拟纵向 - >横向旋转),从而使条形按钮项无效,将其从右侧移除拆分视图,留下我们想要的地方.万岁!
因此,问题在于,由于该发行说明中描述的更改,iOS 4.3内部发生的任何事情都会导致splitViewController:willShowViewController:invalidatingBarButtonItem:
被调用不再发生在iOS 5中.我尝试了子类化UISplitViewController,因此我可以提供自定义的实现,viewWillLayoutSubviews
如发行说明,但我不知道如何重现iOS 4触发的所需内部事件序列.我试过这个:
- (void) viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
UINavigationController *rightStack = [[self viewControllers] objectAtIndex:1];
UIViewController *rightRoot = [[rightStack viewControllers] objectAtIndex:0];
BOOL rightRootHasButton = ... // determine if bar button item for portrait mode is there
// iOS 4 never goes inside this 'if' branch
if (UIInterfaceOrientationIsLandscape( [self interfaceOrientation] ) …
Run Code Online (Sandbox Code Playgroud) 我有一个内存密集型的iOS应用程序,我正在努力确保内存使用不会随着时间的推移而累积.我的应用程序有一个"主要"上下文,它存在于应用程序的生命周期中,其他较小的上下文偶尔会为后台任务生成.
我注意到的一件事是NSManagedObjects似乎长期在主上下文中保持注册,并且真正回收与从DB中提取对象相关的所有内存的唯一方法是调用[NSManagedObjectContext reset]
.
这当然导致内存使用量大幅下降,因为最近关闭的列表视图中的所有已注册对象都从内存中正确弹出,但是它很烦人,因为您刚刚使该上下文中注册的每个对象无效,您仍然有参考to(即仍由打开的视图引用的对象),您现在需要从数据库中重新获取所有这些对象,以避免访问无效对象的异常.
这是从NSManagedObjectContext中清除注册对象集的唯一方法,还是有更好的方法可以成功弹出您不再引用的所有已注册对象,但不会使所有仍处于活动状态的NSManagedObject失效?
从历史上看,我的应用程序已将确认生成为纯HTML,并将该HTML传递给普通的MFMailComposeViewController,以便通过电子邮件发送给客户.我想尝试利用iOS 4.2中的新打印类将HTML呈现为PDF并将其作为附件发送.
我尝试了以下方法:
NSString *html = /* generate my HTML here */
NSMutableData *pdfData = [NSMutableData data];
UIMarkupTextPrintFormatter *fmt = [[UIMarkupTextPrintFormatter alloc]
initWithMarkupText:html];
// Render the html into a PDF
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
for (NSInteger i=0; i < [fmt pageCount]; i++)
{
UIGraphicsBeginPDFPage();
CGRect bounds = UIGraphicsGetPDFContextBounds();
[fmt drawInRect:bounds forPageAtIndex:i];
}
UIGraphicsEndPDFContext();
Run Code Online (Sandbox Code Playgroud)
问题是[fmt pageCount]
始终返回零,因此不会将实际页面内容呈现到PDF NSData中.
有没有人在实际打印作业之外使用UIMarkupTextPrintFormatter将HTML转换为PDF?任何帮助非常感谢.
我并不是100%确定我这样做是正确的,但我认为我发现了一个问题,即auth.Permission
当你从头开始初始化数据库时,很快就没有创建对象以便迁移使用它们.
重要细节:
我正在尝试从头开始初始化Django DB ./manage.py syncdb --migrate --noinput
我的链中有11次迁移
第一次迁移创建了一个名为的新模型 myapp.CompanyAccount
第9次迁移尝试使用以下方式获取权限myapp.change_companyaccount
:
p = orm[ "auth.Permission" ].objects.get( codename = "change_companyaccount" )
此时,会引发异常:
django.contrib.auth.models.DoesNotExist: Permission matching query does not exist
我假设在第一次迁移完成时创建了为每个对象定义的默认权限(根据http://docs.djangoproject.com/en/dev/topics/auth/#default-permissions) ,但它们似乎并非如此.如果我在异常之后重新运行迁移,它会第二次运行,因为显然现在存在权限,并且第9次迁移可以无错误地执行.
在第9次迁移运行之前的某个时间,是否可以做任何事情来"冲洗"所有内容,以便整个过程可以在一次通过中运行而不会挽救?
感谢您提供任何帮助/建议.
编辑:为了回应下面的John的评论,我发现以下命令行序列将起作用:
./manage.py syncdb
(这会初始化默认的Django表)./manage.py migrate myapp 0001
(这会导致创建CompanyAccount表)./manage.py migrate myapp
(这一直迁移到最终没有错误)不幸的是,跳过上面的步骤#2意味着你在0009迁移中得到了相同的异常,这告诉我我原来的怀疑是正确的,新模型的默认权限不是立即由South创建的,并且在某种程度上只是在推送到数据库时整个迁移链完成.
这比我的情况要好(我现在至少避免例外)但是我仍然需要手动分割围绕创建新模型的迁移,后者迁移可能需要触及权限,因此这不是一个完整的解.
当我尝试从服务器发送的数据构建初始数据库时,我遇到了基于CoreData的iOS应用程序的问题.基本上,服务器发送1MB的对象块(每个块约3,000个),iOS客户端对它们进行反序列化并将它们写入磁盘.
我所看到的是,对于前8个块(44个)中的一切都进展顺利,然后性能急剧下降,每个块开始花费的时间越来越长,如下图所示.[NSManagedObjectContext save]
正如您在仪器分析数据中看到的那样,几乎所有时间都消耗掉了,但似乎应用程序由于某种原因不再以100%的CPU运行,就像它正在等待磁盘I/O或其他东西一样.
关于我是如何做到的一些重要事实:
每个块在其自身的处理NSManagedObjectContext
与它自己的NSAutoreleasePool
,所以没有对象积聚在组块的处理之间的非冲洗上下文.
NSUndoManager
任何情境都没有设定.
没有mergeChangesFromContextDidSaveNotification:
进行(即块上下文没有将其更改推送到"主"上下文)
我在iOS 4.3上使用基于SQLite的数据存储.
正在编写的记录确实有索引.
整个同步作业在单个GCD后台线程上处理(即dispatch_queue_create()
和dispatch_async()
).
我不知道为什么性能突然下降,或者可以采取什么措施来解决它.我已经四处寻找并阅读以下内容,但我还没有突然出现:
任何想法或指针使这个应用程序在数据库中扩展到100,000个记录将非常感激.
这个Instruments图表显示了与上面相同的模拟(在iPad2上),但包括磁盘活动统计数据,你可以清楚地看到所有"不在100%CPU运行"的时间似乎都被写入磁盘.
我还在iOS模拟器上运行了相同的同步尝试.除了包含随时间略微增长的对象ID的字典外,每个块的总内存使用量或多或少是恒定的(但这些不是CoreData对象或任何会影响保存的东西,它们只是NSNumbers).与总堆相比,此dict是少量内存,因此问题不会耗尽内存.
这个测试的有趣之处在于CoreData Save仪器报告连续保存花费的时间大致相同,这显然与第一组结果中的CPU分析信息冲突.似乎CoreData认为将更改推送到数据库需要花费相同的时间,但数据库本身(即SQLite)突然需要更长的时间才能将这些更改实际流式传输到磁盘.
performance scalability core-data nsmanagedobjectcontext ios
我在Apple dev论坛上发布了这个,因为它让我感觉像是实际SDK中的一个错误,但我想我也会在这里发布它,看看是否有人可以验证我是否正在使用这个东西错误(看起来不像)或者这是破碎的行为.
https://devforums.apple.com/thread/72738
-
在花了一些时间调试一些代码之后,我发现了一个非常奇怪且令人担忧的实例NSFetchedResultsSectionInfo
.
NSFetchedResultsController *frc = [self frcForTableView:tableView];
id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:
[indexPath indexAtPosition:1]];
NSLog( @"Looking at %@ with section %@ (%d objects)",
indexPath, [sectionInfo objects], [sectionInfo numberOfObjects] );
Run Code Online (Sandbox Code Playgroud)
基本上,我抓住一个FRC,然后从其中拉出一个sectionInfo对象(不要担心为什么我抓住索引路径位置1而不是0 ......这应该不重要).有趣的是,上面的NSLog输出是这样的:
Looking at <NSIndexPath 0x8828ee0> 2 indexes [0, 0] with section (
"TBN.B x 1 for order 1187",
"TBN.T x 1 for order 1187"
) (1 objects)`
Run Code Online (Sandbox Code Playgroud)
因此[sectionInfo objects]
数组中有两个东西,但[sectionInfo numberOfObjects]
报告它只有一个.为了消除缓存问题的可能性,我在运行此代码之前禁用了FRC设置中的所有缓存.
这里很难过.不知道单个sectionInfo对象如何能够自己不同意它有多少个对象.
来自Apple开发者的任何想法?运行XCode 3.2.4和4.1 SDK.
编辑: FYI这个部分的正确对象实际上是第一个(TBN.B)所以在我的测试中到目前为止看来,如果你只考虑对象数组的部分,numberOfObjects
那么你得到了正确的结果.然而,仍然好奇为什么额外的对象出现在数组的末尾时,它不是该部分的一部分.
我有一个Django 1.3应用程序,我使用South 0.7.3进行数据库迁移.我有一个问题,on_delete=models.SET_NULL
当删除父实体时,规则似乎没有触发,从而使我从基础数据库(Postgres 8.4)中违反约束.
实体定义的相关部分是:
class AccessPeriod:
....
class Payment:
period = models.ForeignKey(
AccessPeriod, related_name = "payments", db_index = True,
null = True, on_delete = models.SET_NULL )
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘,我发现南方实际上没有将ON DELETE
子句插入它为迁移生成的SQL中,因此DB绝对不会对破坏的关系本身进行无效处理:
http://south.aeracode.org/ticket/763
然后我读了关于on_delete规则的Django文档,其中说明了(我的重点):
删除ForeignKey引用的对象时,Django默认模拟 SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象.可以通过指定on_delete参数来覆盖此行为.
"模拟"部分向我建议Django尝试实现on_delete行为本身,并且不依赖于底层数据库自动执行此操作作为事务的一部分,从而使South bug无关紧要.
我db/models/deletion.py
在Django源代码中找到了一个基于SET()
/ 的实现,SET_NULL()
并且collect()
看起来Django本身应该这样做,但是,如果我尝试从Django管理员中删除一个AccessPeriod,我会在Payments上出现约束违规行为它仍然引用的ID表现在已被删除,即看起来Django似乎并未调用SET_NULL()
该Payment.period
关系作为调用的一部分accessPeriod.delete()
.
我在这里做错了什么,或者误解了Django应该做什么?只是试图避免手动黑客攻击数据库自己插入ON DELETE规则,这感觉非常脆弱和可怕.
core-data ×4
iphone ×4
ios ×3
django ×2
django-south ×2
ios-4.2 ×2
airprint ×1
constraints ×1
ios5 ×1
memory-leaks ×1
migration ×1
orm ×1
performance ×1
rotation ×1
scalability ×1
string ×1
uitableview ×1
xcode ×1