- (void)fetchResult
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Project" ascending:YES];
[request setEntity:self.entityDescription];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
NSError *fetchError = nil;
BOOL success = [self.fetchResultController performFetch:&fetchError];
if (success) {
NSLog(@"fetched!");
}
else {
NSLog(@"fetch fail!");
}
}
Run Code Online (Sandbox Code Playgroud)
entityDescription和context是在viewDidLoad方法中设置的,如下所示:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
self.entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
崩溃信息: *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'在实体中找不到keypath项目'
有人可以伸手吗?;)
我编写了一种从数据库中随机获取记录的方法,但是无论NSFetchRequest.fetchOffset是什么,我经常会得到相同的记录。
所以我做了一个实验,这是我的代码:
- (Card *)getNextCard {
Card *card = nil;
while (YES) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
request.fetchLimit = 1;
request.fetchOffset = arc4random_uniform(1031);
NSError *error = nil;
NSArray *matches = [self.database.managedObjectContext executeFetchRequest:request error:&error];
if (matches) {
card = [matches lastObject];
// card.phEn= @"phonetic";
}
NSLog(@"nextCard: %@, %d", card ? card.en : card, request.fetchOffset);
}
return card;
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,日志就像:
2013-05-07 23:11:16.035 MyApp[20598:707] nextCard: astound, 153
2013-05-07 23:11:17.175 MyApp[20598:707] nextCard: complicate, 370
2013-05-07 23:11:18.335 MyApp[20598:707] nextCard: hasten, 954
2013-05-07 23:11:19.801 MyApp[20598:707] …Run Code Online (Sandbox Code Playgroud) 对于以下代码,在下面两行之前的两个注释中,只有第一个有效.
NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext];
//Work but strange
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];
//Error
Event.value= [NSNumber numberWithInt:buf4[v+h]];
Run Code Online (Sandbox Code Playgroud)
第二次返回并出错
request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*'
Run Code Online (Sandbox Code Playgroud) 我有核心数据模型:
Book
----
name
release_date
Run Code Online (Sandbox Code Playgroud)
我需要从release_date中获取至少两天的所有书籍,
并且我想要这样做NSPredicate(不要将所有书籍加载到内存中,而不是循环和检查)
我正在寻找的是这样的:
NSDate *now = [NSDate date];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"release_date + "48 hours" <= %@", now];
Run Code Online (Sandbox Code Playgroud) 我必须将字典存储在核心数据中。我以前从未使用过核心数据。
任何人都可以帮助我,如何在现有项目中使用核心数据并将其用于存储Dictionary。
我有一个(NSManagedObject)类被调用TodoItem,它有两个日期属性(startDate和endDate),我想查询此类对象的核心数据.这是代码:
import CoreData
class TodoItem: NSManagedObject {
@NSManaged var name: String!
@NSManaged var addedDate: NSDate!
@NSManaged var doneDate: NSDate!
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我想为当前时间创建另一个日期对象,var currentDate = NSDate()并查询它们和之间的所有TodoItem对象.currentDateaddedDatedoneDate
我怎样才能做到这一点?
我有一个名为type Settings的属性调用的实体,如果它是1,那么视图控制器将具有白色背景,如果为0,则背景为深灰色.backgroundColorInt
但是在尝试打开视图控制器时出现以下错误;
致命错误:数组索引超出范围
对于我的函数中的以下行
if settingsArray.count == 1 {
setting = settingsArray[1]
} else if settingsArray.count <= 0 {
println("No settings in array")
}
Run Code Online (Sandbox Code Playgroud)
查看控制器
var settingsArray: [Settings]!
var setting: Settings!
var backgroundSetting: Bool = true
override func viewWillAppear(animated: Bool) {
backgroundSettings()
}
override func viewDidLoad() {
super.viewDidLoad()
backgroundSettings()
}
// Function to fetch settings and change background
func backgroundSettings() {
var error: NSError?
let request = NSFetchRequest(entityName: "Settings")
self.settingsArray = moc?.executeFetchRequest(request, …Run Code Online (Sandbox Code Playgroud) 我一直在研究如何从表视图中删除数据在Core Data中的行.我在网上找不到任何可以帮助我处理代码的内容.我是Core Data的新手,所以我对它并不是很了解.
提前致谢
这是我的代码
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "OfficialPT")
fetchRequest.sortDescriptors = [NSSortDescriptor(key:"createdAt",ascending:false)]
do {
AirForceDatabase = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
func SideMenus ()
{
if revealViewController() != nil {
MenuButton.target = revealViewController()
MenuButton.action = #selector(SWRevealViewController.revealToggle(_:))
revealViewController().rearViewRevealWidth = 275
revealViewController().rightViewRevealWidth = 160
// profileButton.target = revealViewController()
// …Run Code Online (Sandbox Code Playgroud) 我想更新Core Data中的对象.这是我的代码:
var detailTaskModel: TaskModel!
detailTaskModel.date = dateFromDP //update value
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
appDelegate.saveContext()
Run Code Online (Sandbox Code Playgroud)
我正在使用NSFetchedResultsController和Swift.
更新:
var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()
Run Code Online (Sandbox Code Playgroud)
我的func用于加载CoreData数据:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: TaskCell = tableView.dequeueReusableCellWithIdentifier("myCell") as TaskCell
let thisTask = fetchedResultsController.objectAtIndexPath(indexPath) as TaskModel
cell.textLabel?.text = thisTask.task
return cell
}
Run Code Online (Sandbox Code Playgroud)
保存CoreData:
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let entityDescription = NSEntityDescription.entityForName("TaskModel", inManagedObjectContext: managedObjectContext!)
let task = TaskModel(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext!)
task.task = labelText
Run Code Online (Sandbox Code Playgroud) 我知道核心数据与UITableViewController非常相关,但是我有一个应用程序,它有两个页面,您可以更新数据,如果我能看到每个页面的相关标签中反映的更新值而不必返回,那将是很好的到UITableViewController并使用tableView.reloadData().有没有办法实现这个目标?谢谢
编辑:我添加了一个图表,我希望让我的问题更清晰一些.我想在视图D中对托管对象进行更新,我可以确认(通过println)已经按预期工作,但是当我使用poptoViewController C时,没有任何改变,我看到过时的信息.只有当我返回到桌面视图A时,才会在UI中对对象进行更改.那么我有没有办法在视图C上重新加载对象而不必回到A?
编辑#2:阅读下面的回复(谢谢!)后,我认为我的问题归结为如何在没有UITableView的ViewController上实现NSFetchedResultsController的功能?

core-data ×10
ios ×6
swift ×4
iphone ×3
objective-c ×2
arrays ×1
nsdictionary ×1
nspredicate ×1
optional ×1
swift3 ×1
uitableview ×1
xcode ×1