我有一个包含50,000条记录的数据库.我正在使用核心数据来从搜索中获取记录.搜索可以轻松返回1000条记录.使用核心数据和uitableview来浏览这些记录需要什么?我希望一次显示100条记录,并在查看100条记录后"加载更多"按钮.
我有一些核心数据代码精确地遵循Apple的示例代码(获取满足给定函数示例的获取属性值).我正在使用它来获取字段的最大值,所以当我插入该实体类型的下一个对象时,我可以增加它.
我无法让代码工作,直到我将Store Type切换NSXMLStoreType为NSSQLiteStoreType,然后突然间一切似乎都在工作.但事实并非如此.我注意到它总会返回相同的值,即使我插入了较高的对象.但是,在我退出并重新打开(因此数据被持久化并重新读入)之后,它将使用新插入进行更新.
所以我在每次插入后开始提交和保存.在第一次"自动保存"之后,我得到以下错误(连续两次):
- [NSCFNumber count]:无法识别的选择器发送到实例0x100506a20
当我执行一次获取请求时,会发生这种情况(一行两次):
NSArray *objects = [context executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)
更新
我通过Zombies工具运行我的代码,并且能够查看出现错误的对象.运行malloc以分配它的调用是:-[NSUserDefaults(NSUserDefaults) initWithUser:].由于我没有设置任何自己的默认值,我不知道这可能是什么对象.
更新2
我搜索了所有代码中的"发布",并注释掉静态分析器没有抱怨的每一个release或autorelease那个.我仍然有错误.我甚至竟然在我的代码中注释掉每一个release/ autorelease仍然得到它.现在我很确定我自己的代码不会过度释放.
更新3
这篇文章似乎有同样的问题,但他的解决方案没有意义.他将结果类型从更改NSDictionaryResultType为NSManagedObjectResultType,这会产生不正确的结果.而不是返回单个值(max我正在寻找的那个),它返回托管对象上下文中我的实体类的每个对象.
以下是堆栈跟踪的最顶层(当我第一次在异常时中断):
#0 0x7fff802e00da in objc_exception_throw
#1 0x7fff837d6110 in -[NSObject(NSObject) doesNotRecognizeSelector:]
#2 0x7fff8374e91f in ___forwarding___
#3 0x7fff8374aa68 in __forwarding_prep_0___
#4 0x7fff801ef636 in +[_NSPredicateUtilities max:]
#5 0x7fff800d4a22 in -[NSFunctionExpression expressionValueWithObject:context:]
#6 0x7fff865f2e21 …Run Code Online (Sandbox Code Playgroud) 我想搜索属性description(NSString实例)中是否有给定的单词.
我试过这个谓词:
[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];
Run Code Online (Sandbox Code Playgroud)
它有效,但它也找到了子词.
例如,给定theWord:
汽车
它也将是这个description:
圣诞颂歌
相反,我希望我的谓词只匹配a,或者christmas,或者carol.
(我正在使用Core Data和NSFetchRequest.)
在后台工作的CoreData Apple Docs中,我遇到了一些建议:
例如,您可以将获取请求配置为仅返回对象ID,但也包括行数据(并更新行缓存) - 如果您要将这些对象ID从后台线程传递到另一个线程,这可能很有用.
我想知道你如何实现这个获取请求?具体如何更新行缓存.
我认为这就是获取ID的方式:
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method
request.returnsObjectsAsFaults = YES;
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我的问题:重复NSFetchRequest使用Core Data进行多次不同的提取有什么不好吗?
示例代码:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *logEntity = [NSEntityDescription entityForName:@"LogEntry" inManagedObjectContext:context];
[request setEntity:logEntity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateTimeAction" ascending:NO]; // ascending NO = start with latest date
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@",@"op tijd"];
[request setPredicate:predicate];
[request setFetchLimit:50];
NSError *error = nil;
NSInteger onTimeCount = [context countForFetchRequest:request error:&error];
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"status == %@",@"uitgesteld"];
[request setPredicate:predicate1];
[request setFetchLimit:50];
NSInteger postponedCount = [context countForFetchRequest:request error:&error];
NSPredicate *predicate2 = [NSPredicate …Run Code Online (Sandbox Code Playgroud) 我正在找到核心数据的高级部分.我知道它不是SQL,但是有一些限制,但是,如何将下面的代码转换为NSPredicate以应用于获取请求?
Product* p = self.product; //this is a managed object
double vol=0;
for (PlanningItem* pi in self.planitems) {
if (pi.product==p)
vol+=pi.volume;
Run Code Online (Sandbox Code Playgroud)
如何在NSPredicate的获取请求中执行1操作?我可以同时做2吗?
我要求NSPredicate的字符串.我自己能够建立Fetchrequest.
TX!
我UITableView通过使用以下方式轻松显示所有记录:
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Memo" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"memodate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[appDelegate managedObjectContext] sectionNameKeyPath:nil
cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
return _fetchedResultsController;
Run Code Online (Sandbox Code Playgroud)
对于搜索记录,我正在执行此操作:
- (void)searchBar:(UISearchBar *)aSearchBar textDidChange:(NSString *)searchText {
if (self.searchBar.text ==nil || [self.searchBar.text isEqualToString:@""])
{
self.fetchedResultsController=nil;
}
else
{
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"memodesc CONTAINS[cd] %@", self.searchBar.text];
[_fetchedResultsController.fetchRequest setPredicate:predicate];
}
NSError …Run Code Online (Sandbox Code Playgroud) iphone objective-c nspredicate nsfetchedresultscontroller nsfetchrequest
在我的应用程序中我有一些记录core data,我想按升序获取最后20条记录,即.如果有30条记录,我想按升序从11到30获取记录 -
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Messages" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchLimit:20];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"messageId" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"((userId == %@) && (frndId == %@) )",uid, fid];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray* dataArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
for (Messages* msg in dataArray) {
//code here
}
Run Code Online (Sandbox Code Playgroud)
但它按升序给我前20条记录,如果我改为
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"messageId" ascending:NO];
Run Code Online (Sandbox Code Playgroud)
然后我有最后20条记录,但是按升序排列?任何建议都会受到赞赏.
我如何在swift中使用不同的值调用es请求?
这是我的代码:
let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context: NSManagedObjectContext = appDelegate.managedObjectContext
let request = NSFetchRequest(entityName: "MedicalData")
request.propertiesToFetch = NSArray(object: "docID")
request.returnsObjectsAsFaults = false
request.returnsDistinctResults = true
var results:NSArray = context.executeFetchRequest(request, error: nil)
for data in results {
var thisData = data as MedicalData
println(thisData.docID)
}
Run Code Online (Sandbox Code Playgroud)
我想获得"docID"的不同值,但我获得了所有实体:(
谢谢你的帮助!
我已经在swift 3中转换了我的代码.我在我的应用程序中使用核心数据.如您所知,NSFetchRequest已更改.在swift 2中它是:
let request = NSFetchRequest(entityName: "UnsyncedTask")
Run Code Online (Sandbox Code Playgroud)
在快速3:
let request:NSFetchRequest<NSFetchRequestResult> = UnsyncedTask.fetchRequest()
Run Code Online (Sandbox Code Playgroud)
我的问题是,它只支持ios 10.如何才能使ios兼容?我想要支持ios 9的NSFetchRequest,带有swift 3的ios 10.
nsfetchrequest ×10
core-data ×9
objective-c ×5
ios ×4
nspredicate ×4
iphone ×2
cocoa ×1
cocoa-touch ×1
ios10 ×1
macos ×1
nsstring ×1
sqlite ×1
swift ×1
swift3 ×1
xcode ×1