সত্তা গণনা করার কোকো কোর ডেটা দক্ষ উপায় way


174

আমি কোর ডেটা সম্পর্কে অনেক কিছু পড়েছি .. তবে কোনও সত্তা-ধরণের উপর ভিত্তি করে একটি গণনা করার কার্যকর উপায় কী (যেমন এসকিউএল SELECT গণনা (1) দিয়ে করতে পারে ...)। এখন আমি সমস্তটি নির্বাচন করে NSFetchedResultsControllerএবং এর গণনা পাওয়ার সাথে সাথে এই কাজটি সমাধান করেছি NSArray! আমি নিশ্চিত যে এটি সর্বোত্তম উপায় নয় ...

উত্তর:


303

আমি জানি না যে এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার ব্যবহার করা আপনার লক্ষ্য অর্জনের সবচেয়ে কার্যকর উপায় (তবে এটি হতে পারে)। সত্তার উদাহরণগুলির গণনা পাওয়ার জন্য স্পষ্ট কোডটি নীচে:

// assuming NSManagedObjectContext *moc

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:moc]];

[request setIncludesSubentities:NO]; //Omit subentities. Default is YES (i.e. include subentities)

NSError *err;
NSUInteger count = [moc countForFetchRequest:request error:&err];
if(count == NSNotFound) {
  //Handle error
}

[request release];

1
চিতাবাঘে আপনি কাউন্টফরফেরচ্যুয়েস্ট: এবং এক্সটেকিউট ফ্যাচ-রিকুয়েস্ট ব্যবহার করতে চান:
ইলডান

এবং ভবিষ্যদ্বাণীটি সেট করতে এড়িয়ে যান। কোনও
পূর্বানুমতি নেই:

4
কেবল FYI, গণনা == 0 নির্দিষ্ট অনুরোধের জন্য কোনও ফলাফল না থাকলে, NSNotFound = NSIntegerMax, সুতরাং কোনও ফলাফল না থাকলে '// হ্যান্ডেল ত্রুটি' কার্যকর করা হবে না।
ইন্টেন্টস

এখানে কি টাইপ আছে: সেটলিঙ্কসুবেন্টিটিস? আমি মনে করি ডকুমেন্টেশন উদাহরণ কোডে উপরের কেস "E" এর চেয়ে "সত্তা" তে একটি ছোট ক্ষেত্রে "ই" নির্দেশ করে।
মাইক 23

2
@ লার্স শ্নাইডার countForFetchRequest:error:রাজ্যগুলির জন্য ডকুমেন্টেশনগুলি যা NSNotFoundকোনও ত্রুটির ক্ষেত্রে ফিরে আসে। সাধারণভাবে, NSErrorকোকো কনভেনশনটিতে পরিচালনা করা হ'ল errকোনও ত্রুটি না ঘটলে এর মান অপরিজ্ঞাত (এবং প্রায়শই বিপজ্জনক) হয়।
ব্যারি ওয়ার্ক

61

স্পষ্টতই, আপনি সত্তাগুলি গণনা করছেন না, তবে কোনও নির্দিষ্ট সত্তার উদাহরণ। (আক্ষরিকভাবে সত্তাগুলি গণনা করতে, তার সত্তার গণনার জন্য পরিচালিত অবজেক্ট মডেলকে জিজ্ঞাসা করুন))

সমস্ত ডেটা, ব্যবহার ব্যবহার না করে প্রদত্ত সত্তার সমস্ত দৃষ্টান্ত গণনা করতে -countForFetchRequest:

উদাহরণ স্বরূপ:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity: [NSEntityDescription entityForName: entityName inManagedObjectContext: context]];

NSError *error = nil;
NSUInteger count = [context countForFetchRequest: request error: &error];

[request release];

return count;

32

দ্রুতগতি

কোর ডেটাতে সত্তার মোট উদাহরণগুলির একটি সংখ্যা গণনা করা মোটামুটি সহজ:

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
let count = context.countForFetchRequest(fetchRequest, error: nil)

আমি এটি 400,000+ অবজেক্ট গণনা সহ সিমুলেটারে পরীক্ষা করেছি এবং ফলাফলটি মোটামুটি দ্রুত (যদিও তাত্ক্ষণিক নয়)।


23

আমি এটিকে আরও দক্ষ করে তুলতে কেবল এটি যুক্ত করব ... এবং এটির কেবল একটি গণনা, আপনার কোনও সম্পত্তি মূল্য সত্যই প্রয়োজন নেই এবং অবশ্যই উপরের কোড উদাহরণগুলির একটির মতো আপনারও উপ-সত্ত্বার প্রয়োজন নেই don't

সুতরাং কোডটি এর মতো হওয়া উচিত:

int entityCount = 0;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourEntity" inManagedObjectContext:_managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesPropertyValues:NO];
[fetchRequest setIncludesSubentities:NO];
NSError *error = nil;
NSUInteger count = [_managedObjectContext countForFetchRequest: fetchRequest error: &error];
if(error == nil){
    entityCount = count;
}

আশা করি এটা সাহায্য করবে.


10

আমি বিশ্বাস করি যে অবজেক্টগুলি গণনা করার সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উপায় হ'ল NSFetchRequestফলটি টাইপ করে NSCountResultTypeসেটাকে NSManagedObjectContext countForFetchRequest:error:পদ্ধতিতে চালিত করা।

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:entityName];
fetchRequest.resultType = NSCountResultType;
NSError *fetchError = nil;
NSUInteger itemsCount = [managedObjectContext countForFetchRequest:fetchRequest error:&fetchError];
if (itemsCount == NSNotFound) {
    NSLog(@"Fetch error: %@", fetchError);
}

// use itemsCount

6

অবজেক্টের সংখ্যা আনতে আমি সুইফট 3 এর জন্য একটি সহজ ইউটিলিটি পদ্ধতি লিখেছিলাম।

static func fetchCountFor(entityName: String, predicate: NSPredicate, onMoc moc: NSManagedObjectContext) -> Int {

    var count: Int = 0

    moc.performAndWait {

        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: entityName)
        fetchRequest.predicate = predicate
        fetchRequest.resultType = NSFetchRequestResultType.countResultType

        do {
            count = try moc.count(for: fetchRequest)
        } catch {
            //Assert or handle exception gracefully
        }

    }

    return count
}

3

সুইফ্ট 3 এ

  static func getProductCount() -> Int {
    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Product")
    let count = try! moc.count(for: fetchRequest)
    return count
}

1

এটি আসলে এই মাত্র:

let kBoat = try? yourContainer.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

"নৌকা" আপনার ডেটা মডেল স্ক্রিন থেকে সত্তার নাম মাত্র:

এখানে চিত্র বর্ণনা লিখুন

বিশ্বব্যাপী কী yourContainer?

মূল ডেটা ব্যবহার করতে, আপনার অ্যাপ্লিকেশনটির এক পর্যায়ে কেবল একবারে আপনি কেবল যান

var yourContainer = NSPersistentContainer(name: "stuff")

যেখানে "স্টাফ" হ'ল ডেটা মডেল ফাইলের নাম।

এখানে চিত্র বর্ণনা লিখুন

আপনার এইটির জন্য কেবল একটি সিঙ্গলটন থাকতে হবে,

import CoreData
public let core = Core.shared
public final class Core {
    static let shared = Core()
    var container: NSPersistentContainer!
    private init() {
        container = NSPersistentContainer(name: "stuff")
        container.loadPersistentStores { storeDescription, error in
            if let error = error { print("Error loading... \(error)") }
        }
    }
    
    func saveContext() {
        if container.viewContext.hasChanges {
            do { try container.viewContext.save()
            } catch { print("Error saving... \(error)") }
        }
    }
}

সুতরাং অ্যাপ থেকে যে কোনও জায়গা থেকে

core.container

আপনার ধারক,

সুতরাং বাস্তবে কোনও সত্তার গণনা পাওয়ার জন্য, এটি ঠিক

let k = try? core.container.viewContext.count(for: NSFetchRequest(entityName: "Boat"))

0

আপনি যদি নির্দিষ্ট পূর্বাভাস প্রাপ্তির জন্য গণনা সন্ধান করতে চান তবে আমি বিশ্বাস করি যে এটিই সেরা উপায়:

NSError *err;
NSUInteger count = [context countForFetchRequest:fetch error:&err];

if(count > 0) {
NSLog(@"EXIST"); 
} else {
NSLog(@"NOT exist");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.