简体   繁体   English

Swift:获取 CoreData 作为数组

[英]Swift: Fetch CoreData as Array

I want to fetch all Saved Data in the sqlite table.我想获取 sqlite 表中的所有已保存数据。

I'm currently doing this:我目前正在这样做:

 func GetAllData() -> NSArray
{
    var error : NSError? = nil;
    var request : NSFetchRequest = NSFetchRequest(entityName: "Locations");
    let result : [AnyObject] = managedObjectContext!.executeFetchRequest(request, error:&error)!;
      var elements : NSMutableArray = NSMutableArray();
    for fetchedObject in result
    {
        elements.addObject(fetchedObject[0]);
    }
    print(elements);
    return elements;
}

I have no problems to fetch Data in Objective-C but in swift I dont get it!我在 Objective-C 中获取数据没有问题,但在 swift 中我不明白!

The saving of the data works fine.数据的保存工作正常。 I have two rows "Name" and "Category".我有两行“名称”和“类别”。 How can I show all saved data?如何显示所有保存的数据?

You should load all your Objects from CoreData into an Array/Dict of NSManaged Objects.您应该将 CoreData 中的所有对象加载到 NSManaged 对象的数组/字典中。

For Example:例如:

    var locations  = [Locations]() // Where Locations = your NSManaged Class

    var fetchRequest = NSFetchRequest(entityName: "Locations")
    locations = context.executeFetchRequest(fetchRequest, error: nil) as [Locations]

    // Then you can use your properties.

    for location in locations {

      print(location.name)   

    }

Try this:尝试这个:

let fetchRequest = NSFetchRequest(entityName: "Locations")
        
do {
     let results   = try managedObjectContext.executeFetchRequest(fetchRequest)
     let locations = results as! [Locations]
        
     for location in locations {
       print(location)   
     }

} catch let error as NSError {
  print("Could not fetch \(error)")
}

Swift 3斯威夫特 3

func fetchData(){

    onlyDateArr.removeAll()
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "PhotoData")

    do {
        let results = try context.fetch(fetchRequest)
        let  dateCreated = results as! [PhotoData]

        for _datecreated in dateCreated {
            print(_datecreated.dateCreation!)
            onlyDateArr.append(_datecreated)
        }
    }catch let err as NSError {
        print(err.debugDescription)
    }


}

2020 syntax 2020 语法

to copy and paste复制和粘贴

func grabAllPersons() {
    var pp: [CD_Person] = []
    do {
        let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CD_Person")
        let f = try core.container.viewContext.fetch(r)
        pp = f as! [CD_Person]
    } catch let error as NSError {
        print("woe grabAllPersons \(error)")
    }
    
    for p: CD_Person in pp {
        print(" >> \(p.firstName)")
    }
}

Note that core.container.viewContext is "your" context, often (but not always) the one supplied by core.container.viewContext .请注意, core.container.viewContext是“您的”上下文,通常(但不总是)由core.container.viewContext提供。 ( Example ) 示例

Critical tip...关键提示...

In some cases:在某些情况下:

it is ABSOLUTELY important that you do not accidentally use the "wrong" context.绝对重要的是不要意外使用“错误”的上下文。

For example, you are doing a minor incidental issue, such as counting or just grabbing all the items.例如,您正在做一个小的附带问题,例如计数或只是抓取所有项目。

This issue is explained HERE under the large heading "exercise extreme caution..."这个问题解释这里的大标题下的“演习格外小心......”

You don't have to (force) cast any result from NSFetchRequest:您不必(强制)从 NSFetchRequest 中投射任何结果:

var locations  = [Locations]()
var fetchRequest = NSFetchRequest<Locations>(entityName: "Locations") //Note the <Locations> makes the NSFetchRequestResult to an array of Locations 
locations = context.executeFetchRequest(fetchRequest, error: nil)
 
for location in locations {
    print(location.name)   
}

Another note: Usually you should name your entities in singular like "Location", not "Locations".另一个注意事项:通常你应该用单数命名你的实体,比如“位置”,而不是“位置”。 And then an array of Location are locations.然后一个 Location 数组是位置。 let locations = Array<Location>(location1, location2)

import UIKit
import CoreData
class CoreDataHandler: NSObject {

    private class func getContext() -> NSManagedObjectContext
    {
        let delegate = UIApplication.shared.delegate as? AppDelegate

        return (delegate?.persistentContainer.viewContext)!
    }


    class func saveObeject (name:String,roll:String,college:String)
    {
        let context =  getContext()
        let entity = NSEntityDescription.entity(forEntityName: "CountryInfo", in: context)

        let manageObjet = NSManagedObject(entity: entity!, insertInto: context)

        manageObjet.setValue(name, forKey: "name")
        manageObjet.setValue(roll, forKey: "roll")
        manageObjet.setValue(college, forKey: "college")


        do
        {
            try context.save()
        }catch
        {
            print("unable to save data")
        }
    }

    class func getCountryDetail(name:String) ->Array<Any>?
    {

        // return "http://1.bp.blogspot.com/-J9emWhBZ_OM/TtQgVQmBHRI/AAAAAAAAD2w/j7JJMRMiuAU/s1600/Al_Ain_FC.png"
        let contecxt = getContext()
        let fetchRequest:NSFetchRequest<CountryInfo> = CountryInfo.fetchRequest()

        var user:[CountryInfo] = []
        let predicate = NSPredicate(format: "name LIKE[cd] %@",name)
        fetchRequest.predicate = predicate
        do{
            user =  try contecxt.fetch(fetchRequest)
            let ClubInfoBO = user
            print(ClubInfoBO)
            return (ClubInfoBO) as? Array<Any>
        }catch
        {
            return nil

        }

    }


    class func deleteObject(user:CountryInfo) ->Bool{
        let context = getContext()
        context.delete(user)
        do
        {
            try context.save()
            return true
        }catch{
            return false
        }
    }

    //Clean delete

    class func cleanDelete () ->Bool
    {
        let context = getContext()
        let delete = NSBatchDeleteRequest(fetchRequest: CountryInfo.fetchRequest())

        do{
            try context.execute(delete)
            return true
        }catch
        {
            return false
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM