মূল ডেটা: সত্তার সমস্ত দৃষ্টান্ত মুছার দ্রুততম উপায়


383

আমি স্থানীয়ভাবে কোনও ওয়েব পরিষেবাদি কল থেকে ফলাফল অবিরত রাখতে কোর ডেটা ব্যবহার করছি। ওয়েব সার্ভিস এর জন্য পূর্ণ বস্তু মডেলটি ফেরত পাঠায়, যাক, বলা যাক "গাড়ি" - এর মধ্যে প্রায় 2000 থাকতে পারে (এবং আমি ওয়েব সার্ভিস 1 বা সমস্ত গাড়ির চেয়ে কম কিছু ফেরত দিতে পারি না)।

পরের বার যখন আমি আমার অ্যাপ্লিকেশনটি খুলি, আমি আবার সমস্ত গাড়ির জন্য ওয়েব পরিষেবাতে কল করে কোর ডেটা কপিরাইটটি রিফ্রেশ করতে চাই, তবে ডুপ্লিকেটগুলি রোধ করার জন্য আমাকে প্রথমে স্থানীয় ক্যাশে সমস্ত ডেটা পরিষ্কার করতে হবে।

পরিচালিত অবজেক্ট প্রসঙ্গে (যেমন "CAR" টাইপের সমস্ত সত্ত্বা) সুনির্দিষ্ট সত্তার সমস্ত উদাহরণকে শুদ্ধ করার আরও দ্রুত উপায় আছে, বা তাদের কীভাবে কল করার দরকার আছে, তারপরে প্রতিটি মুছে ফেলার জন্য ফলাফলগুলি পুনরাবৃত্তি করতে হবে, তারপরে সংরক্ষণ করতে হবে?

আদর্শভাবে আমি কেবল বলতে পারি যেখানে সত্তা ব্লাহ সেখানে সমস্ত মুছুন।


আপনি মেমোরি ডাটাবেসে একটি ব্যবহার করতে পারেন
জে ডো

উত্তর:


718

iOS 9 এবং তারপরে:

আইওএস 9 একটি নতুন ক্লাস নামে যুক্ত করেছে NSBatchDeleteRequestযা আপনাকে প্রেমিকে মেলানো অবজেক্টগুলিকে মেমরিতে লোড না করে সহজেই মুছতে দেয়। আপনি এটি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে:

সুইফট 5

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    try myPersistentStoreCoordinator.execute(deleteRequest, with: myContext)
} catch let error as NSError {
    // TODO: handle the error
}

উদ্দেশ্য গ

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];

NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];

ব্যাচ মুছে ফেলার বিষয়ে আরও তথ্য ডাব্লুডাব্লুডিসি 2015 ( "Data 14: 10 থেকে শুরু) এর " কোর ডেটাতে নতুন কী "সেশনে পাওয়া যাবে

আইওএস 8 এবং আগের:

তাদের সকল আনুন এবং এগুলি মুছুন:

NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
  [myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here

74
আমি পূর্ণ এনজেক্ট স্ট্রাকচারে লোডিং থেকে কোনও ওভারহেড হ্রাস করতে কেবল NSManagedObjectID পুনরুদ্ধার করতে আনতে কনফিগার করব।
মার্কাস এস জারা

38
কীভাবে কেবল এনএস ম্যাঙ্গেজডোবজেক্টআইডি আনতে হবে তা স্পষ্ট নয় .. ব্যবহার করুন [allCars setIncludesPerertyValues: NO]; (এবং কীভাবে অবজেক্ট আইডির জন্য একটি এনএসপোপার্টিডেস্ক্রিপশন বানাতে হয় সে সম্পর্কে আশেপাশে বিরক্ত করবেন না)
ওহোরব

6
নবাগত প্রশ্নের জন্য দুঃখিত: লুপটি শেষ হওয়ার পরে আপনার কি প্রসঙ্গটি সংরক্ষণ করা দরকার? যেমন [মাই কনটেক্সট সেভ];
স্টিভ

6
এটিকে আরও দক্ষ করার জন্য কোর ডেটাতে কোনও নতুন সুবিধা? এটি আমার অ্যাপ্লিকেশনটির জন্য ইতিমধ্যে কোর ডেটা পর্যন্ত রোড পোর্টিংয়ের নিচে একটি গুরুতর সমস্যা। বেশ কয়েকটি সারণীর মধ্যে কেবল একটি থেকে সমস্ত 4000 এন্ট্রি মুছতে একাধিক সেকেন্ড সময় লাগছে। এটি ব্যবহারকারী অপেক্ষা করতে খুব দীর্ঘ is স্ক্লাইটের সাথে সরাসরি অনুরোধটি তাত্ক্ষণিক মনে হয়।
ডেভিড

4
@ ডেভিডলং কীভাবে এনএসব্যাচডিলিটরউয়েস্ট এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার প্রতিনিধিকে ট্রিগার করতে পারে? আমি প্রায় সব চেষ্টা করে দেখি, কিন্তু কিছুই হয় নি।
ফোরইগার

36

সুইফট 3 এ সত্তা পুনরায় সেট করুন :

func resetAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
        do
        {
            try context.execute(deleteRequest)
            try context.save()
        }
        catch
        {
            print ("There was an error")
        }
    }

32

আরও কিছুটা পরিষ্কার এবং সর্বজনীন: এই পদ্ধতিটি যুক্ত করুন:

- (void)deleteAllEntities:(NSString *)nameEntity
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:nameEntity];
    [fetchRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID

    NSError *error;
    NSArray *fetchedObjects = [theContext executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *object in fetchedObjects)
    {
        [theContext deleteObject:object];
    }

    error = nil;
    [theContext save:&error];
}

16

সুইফট ২.০ এর জন্য:

class func clearCoreData(entity:String) {
  let fetchRequest = NSFetchRequest()
  fetchRequest.entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: moc!)
  fetchRequest.includesPropertyValues = false
  do {
    if let results = try moc!.executeFetchRequest(fetchRequest) as? [NSManagedObject] {
      for result in results {
        moc!.deleteObject(result)
      }

      try moc!.save()
    }
  } catch {
    LOG.debug("failed to clear core data")
  }
}

12

সুইফট:

let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
fetchRequest.includesPropertyValues = false

var error:NSError?
if let results = context.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject] {
    for result in results {
        context.deleteObject(result)
    }

    var error:NSError?
    if context.save(&error) {
        // do something after save

    } else if let error = error {
        println(error.userInfo)
    }

} else if let error = error {
    println("error: \(error)")
}

1
এই উত্তরটি নতুন চেষ্টা / ক্যাচ ত্রুটি পরিচালনার সাথে আপডেট করা উচিত
সুরগাচ

10

এই এক একটি অনুরূপ প্রশ্ন হল এখানে এবং কেউ একটি সম্পর্ক ডিলিট নিয়ম স্থাপনের তাই আপনি যদি শুধুমাত্র একটি বস্তু মুছে দিতে হবে সুপারিশ করেছে। সুতরাং আপনার যদি গাড়ীর সাথে একাধিক সম্পর্কের সাথে কোনও সত্তা তৈরি করা যায় বা করতে পারে এবং আপনি যখন উচ্চতর সত্তা মুছবেন তখন সমস্ত গাড়িও মুছে ফেলা হবে cas এটি কিছু প্রক্রিয়াজাতকরণের সময় সাশ্রয় করতে পারে যেহেতু আপনাকে সমস্ত গাড়ি লোড করার সাথে জড়িত পদক্ষেপগুলি করতে হবে না। বৃহত্তর ডেটা সেটে এটি একেবারে প্রয়োজনীয় হতে পারে।


1
আমি প্রায় 600 টি মূল ডেটা অবজেক্ট সহ আমার বর্তমান প্রকল্পে এটি চেষ্টা করেছি। আমি যখন তাদেরকে ক্যাসকেড দিয়ে অন্য কোনও বস্তুতে আবদ্ধ করি তখন এটি মুছতে প্রায় 9.1 সেকেন্ড সময় নেয়। যদি আমি ডেভের প্রস্তাবিত পদ্ধতিটি ব্যবহার করি তবে এটি মুছতে প্রায় 8.7 সেকেন্ড সময় লাগে। আমার জন্য একটি উল্লেখযোগ্য পার্থক্য নয়।
অ্যান্ড্রু জিমার

8

একটি ভাল উত্তর ইতিমধ্যে পোস্ট করা হয়েছিল, এটি কেবল একটি সুপারিশ!

NSManagedObjectআমার মতো একটি পদ্ধতিতে কেবল একটি বিভাগ যুক্ত করা এবং এটি প্রয়োগ করা একটি ভাল উপায় হবে :

শিরোনাম ফাইল (উদাঃ NSManagedObject+Ext.h)

@interface NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString*) entityName;

@end

কোড ফাইল: (উদাহরণস্বরূপ NSManagedObject + Ext.m)

@implementation NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString *)entityName {
    NSManagedObjectContext *managedObjectContext = [AppDelegate managedObjectContext];
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [managedObjectContext executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [managedObjectContext deleteObject:profile];
    }
    NSError *saveError = nil;
    [managedObjectContext save:&saveError];
}

@end

... আপনার কেবলমাত্র জিনিসটি হ'ল অ্যাপ ডেলিগেটের কাছ থেকে পরিচালিতঅবজেক্ট কনটেক্সট পাওয়া, বা যেখানে আপনার এটি রয়েছে প্রত্যেকটি;)

এরপরে আপনি এটি ব্যবহার করতে পারেন:

[NSManagedObject deleteAllFromEntity:@"EntityName"];

আরও একটি অপ্টিমাইজেশন হ'ল আপনি থ সত্তা নামের জন্য প্যারামিটারটি সরিয়ে এবং ক্লাজনামের পরিবর্তে নাম পান। এটি ব্যবহারে নেতৃত্ব দেবে:

[ClazzName deleteAllFromEntity];

আরও ক্লিন ইমপ্ল (এনএসম্যানেজডঅবজেক্ট কনটেক্সট অনুসারে):

@implementation NSManagedObjectContext (Logic)

- (void) deleteAllFromEntity:(NSString *)entityName {
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:self]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [self executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [self deleteObject:profile];
    }
    NSError *saveError = nil;
    [self save:&saveError];
}

@end

এর পরে ব্যবহার:

[managedObjectContext deleteAllFromEntity:@"EntityName"];

1
দুঃখিত, তবে অবশ্যই [AppDelegate managedObjectContext]এটি "পরিষ্কার আর্কিটেকচার" নয় .. ;-)
ড্যানিয়েল রিন্সার

ঠিক আছে, সত্য। এর উপরের কোডটি একটি পরিচালিতঅবজেক্ট কনটেক্সট উপর ভিত্তি করে। প্রাথমিকটি;) মাল্টিথ্রেটেড কোডে আমি সাধারণত অ্যাপের প্রতিনিধিটির মূল
এমওসিটি

1
@ ড্যানিয়েলরিন্সার হতে পারেdeleteAllFromEntity: inManagedObjectContext:
মোহাম্মদ এলকাসাস

হ্যাঁ. ক্লাসের পদ্ধতি থেকে একটি অবজেক্ট পদ্ধতিতে মুছে ফেলা AllFromEntity পদ্ধতি পরিবর্তন করা ভাল। তারপরে আপনি সরাসরি একটি এমওসি ইভেন্টে ডিলিটএলফ্র্যামএন্টিটি কল করতে পারেন।
এরহার্ড ডিনহব্ল

7

সুইফট 4, আইওএস 12 এবং এক্সকোড 10 আপডেট

100% কাজ করছে কেবল কাটা এবং পেস্ট করুন

শুধু প্রাসঙ্গিক ক্লাসে এই ফাংশন করা এবং এই ফাংশন কল self.deleteData()মধ্যে viewDidLoad()যে কোন জায়গায় বা বা একটি ফাংশন তাই একটি বাটন অধীনে যে একটি বোতামে ক্লিক করে সত্তা থেকে সমস্ত ডেটা মুছে ফেলা হবে এবং প্রতিস্থাপন আপনার সত্তা হিসাবে "myEntity" এর জন্য সংজ্ঞায়িত নি তারা আপনার মূল তথ্য

func deleteData() {
    let appDel:AppDelegate = (UIApplication.shared.delegate as! AppDelegate)
    let context:NSManagedObjectContext = appDel.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "myEntity")
    fetchRequest.returnsObjectsAsFaults = false         
    do {
        let results = try context.fetch(fetchRequest)
        for managedObject in results {
            if let managedObjectData: NSManagedObject = managedObject as? NSManagedObject {
                context.delete(managedObjectData)
            }
        }
    } catch let error as NSError {
        print("Deleted all my data in myEntity error : \(error) \(error.userInfo)")
    }
}

আপনাকে ধন্যবাদ, তবে কেন এনএসব্যাচডিলিটরয়েস্ট ধারণাটি কাজ করছে না? কোন ধারণা.
সুরেশ দুরিশেত্তি

@ সুরেশডুরিশেটি আপনি কি আপনার ক্লাসে কোরডাটা আমদানি করেছেন?
এক্সকডিয়ান সোলঙ্গি

1
হ্যাঁ, কোরডেট যুক্ত হয়েছে। তবে ভাগ্য নেই।
সুরেশ দুরিশেত্তি

4
আপনি প্রসঙ্গে কল সেভ যোগ করতে ভুলে গেছেন, প্রসঙ্গটি যুক্ত করুন। সংরক্ষণ করুন () এবং আপনি যেতে ভাল
পরমা ধর্মিকা

হ্যাঁ, এর জন্য প্রসঙ্গ সংরক্ষণ করা দরকার অন্যথায় কোনও পরিবর্তন ঘটবে না
সুরেন্দ্র কুমার

5

সুইফট 3. এক্স এবং সুইফট 4. এক্স , সহজ উপায়। শুধুমাত্র আপনার টেবিল পরিবর্তন করুন

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourTable")
    fetchRequest.returnsObjectsAsFaults = false

    do
    {
        let results = try context.fetch(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            context.delete(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all my data in \(entity) error : \(error) \(error.userInfo)")
    }

এছাড়াও আপনি এই নির্মাণটি ব্যবহার করতে পারেন: আসুন আনতে: NSFetchRequest <NSFetchRequestResult> = YourTable.fetchRequest ()
দানিল Chuiko

5

iOS 10 এবং তারপরে

সমস্ত সংস্করণ সঙ্গে কাজ করে। সমস্ত এন্ট্রি মোছার জন্য এবং প্রসঙ্গটি সংরক্ষণ করতে সত্তার নাম পাস করুন এবং পুনরাবৃত্তি করুন।

func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
        let context = NSManagedObjectContext()
        context = your managedObjectContext

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
        fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
        fetchRequest.includesPropertyValues = false
         do {   
            let results = try context.fetch(fetchRequest) as! [NSManagedObject]
            for result in results {
                context.delete(result)
            }
            try context.save()
            completion(true)
        } catch {
            completion(false)
            print("fetch error -\(error.localizedDescription)")
        }
    }

2
আপনার উত্তর পোস্ট করার জন্য ধন্যবাদ। সেটা আমার জন্য কাজ করে. তবে আপনার এখানে কেবল আপনার কোড অনুলিপি করা ও আটকাতে হবে না। একটি newbee জন্য এটা স্পষ্ট নয় কি আপনার CoreDataStack()বা DataController()শ্রেণীর হয়। একটি আপডেট প্রশংসা করা হবে;)
নিকো এস

4

ডেভ দেলং এর উত্তর বাড়ানো হচ্ছে।

আইওএস 9 এবং পূর্ববর্তী সংস্করণগুলিরও যত্ন নেয় সুইফট সংস্করণ। আমি এতে ত্রুটি পরিচালনার বিষয়টিও কভার করেছি:

অ্যাপডেলিগেট যাক: অ্যাপডেলিগেট = ইউআইএপ্লিকেশন.শ্রেড অ্যাপ্লিকেশন ()। হিসাবে প্রতিনিধি! AppDelegate

    let fetchRequest = NSFetchRequest(entityName: "Car")
    if #available(iOS 9.0, *) {
        let delete = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try appDelegate.persistentStoreCoordinator.executeRequest(delete, withContext: appDelegate.managedObjectContext)
        } catch let error as NSError {
            print("Error occured while deleting: \(error)")
        }
    } else {
        // Fallback on earlier versions
        let carRequest = NSFetchRequest()
        carRequest.entity = NSEntityDescription.entityForName("Cars", inManagedObjectContext: appDelegate.managedObjectContext)
        carRequest.includesPropertyValues = false

        do {
            let cars: NSArray = try appDelegate.managedObjectContext.executeFetchRequest(carRequest)

            for car in cars {
                appDelegate.managedObjectContext.delete(car)
            }

            try appDelegate.managedObjectContext.save()

        } catch let error as NSError {
            print("Error occured while fetching or saving: \(error)")
        }
    }

upvated। ios 9 রেকর্ড মুছে ফেলার উপায় সত্যিই awsm।
শোভাকর তিওয়ারি

2

আপনি বিদ্যমান ক্যাশে যে ডেটা পান তা ভাঁজ করবেন না কেন? অন্যথায় এটি সত্যিই 'রিফ্রেশিং' নয়, এটি 'আবার শুরু' এবং আপনি এসকিউএলাইট ফাইলটি ড্রপ / মুছে ফেলতে এবং আবার শুরু করতে পারেন (ধরে নিবেন আপনি অন্যান্য ডেটাও চালিয়ে যাচ্ছেন না)।


1
খারাপ সমাধান। স্ক্লাইট ডাটাবেসে যদি অন্য টেবিলগুলি থাকে তবে আমরা স্পষ্টতই এগুলি সরিয়ে দেব। এটি একটি নির্দিষ্ট সমাধানের জন্য আরও একটি হ্যাক এবং বড় ক্ষেত্রে এটি বিবেচনা করা যায় না।
দীপক জিএম

2

সুইফট 4, আইওএস 10+
স্ট্যাটিক ফাংশন যা কোনও সত্তার জন্য তার সমস্ত ডেটা মুছে ফেলার জন্য আবেদন করতে পারে

protocol NSManagedObjectHelper {
}
extension NSManagedObject: NSManagedObjectHelper {
}
extension NSManagedObjectHelper where Self: NSManagedObject {
    static func removeAllObjectsInContext(_ managedContext: NSManagedObjectContext) {
        let request: NSFetchRequest = NSFetchRequest(entityName: String(describing: self))
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
        do {
            deleteRequest.resultType = .resultTypeObjectIDs//to clear objects from memory
            let result = try managedContext.execute(deleteRequest) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey : objectIDArray]
                /*By calling mergeChangesFromRemoteContextSave, all of the NSManagedObjectContext instances that are referenced will be notified that the list of entities referenced with the NSManagedObjectID array have been deleted and that the objects in memory are stale. This causes the referenced NSManagedObjectContext instances to remove any objects in memory that are loaded which match the NSManagedObjectID instances in the array.*/
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedContext])
            }
            try managedContext.save()
        } catch let error {
            print(error)
        }
    }
}

'ঘর' একটি সত্তা

Room.removeAllObjectsInContext(self.persistentContainer.viewContext)

20191025-এ সম্পাদিত: "আমরা যদি একই প্রকল্পগুলিতে একাধিক লক্ষ্য ব্যবহার করি তবে" সেলফ.ফ্যাচআরকুয়েস্ট () "নির্দেশনা সমস্যার কারণ হতে পারে। সুতরাং NSFetchRequest (সত্তা নাম: স্ট্রিং (বর্ণনা: স্ব)) দিয়ে প্রতিস্থাপন করা হয়েছে


1

সত্তায় যদি অনেক এন্ট্রি থাকে তবে সর্বোত্তম উপায় এটির কারণ এটি মেমরিটি সঞ্চয় করে

 - (void)deleteAll:(NSManagedObjectContext *)managedObjectContext entityName:(NSString *)entityName
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [managedObjectContext setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesPropertyValues:NO];
    [fetchRequest setFetchLimit:100]; // you can change this number if you want
    NSError *error;
    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    while ([items count] > 0) {
        @autoreleasepool {
            for (NSManagedObject *item in items) {
                [managedObjectContext deleteObject:item];
            }
            if (![managedObjectContext save:&error]) {
                NSLog(@"Error deleting %@ - error:%@",self.entityName, error);
            }
        }
        items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    }
}

1

সুইফট ৩.০ এ

 func deleteAllRecords() {
        //delete all data
        let context = appDelegate.persistentContainer.viewContext

        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "YourClassName")
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try context.execute(deleteRequest)
            try context.save()
        } catch {
            print ("There was an error")
        }
    }

1

এই কোডটি আইওএস 9 এবং নীচে উভয়ের জন্যই কাজ করবে

class func deleteAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = CoreDataStack.getContext() // Note:- Replace your context here with CoreDataStack.getContext()
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        if #available(iOS 9, *)
        {
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
            do
            {
                try context.execute(deleteRequest)
                try context.save()
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        else
        {
            do{
                let deleteRequest = try context.fetch(deleteFetch)
                for anItem in deleteRequest {
                    context.delete(anItem as! NSManagedObject)
                }
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        CoreDataStack.saveContext() // Note:- Replace your savecontext here with CoreDataStack.saveContext()
    }

1

আইওএস 9.0 এবং পরবর্তী:

NSBatchDeleteRequestমূল ডেটাতে রেকর্ড মুছতে ব্যবহৃত হয়। এটি খুব দ্রুত কাজ করে এবং সত্তা থেকে সমস্ত রেকর্ড মুছতে কম সময় নেয়। এটি NSFetchRequestযুক্তিযুক্ত প্রয়োজন । আপনি যদি কোনও সত্তা থেকে সমস্ত রেকর্ড মুছতে চান তবে আপনি এটি ব্যবহার করতে পারেন এবং এটি আমার পক্ষে কাজ করে।

let manageObject:NSManagedObjectContext = appDelegateObject.managedObjectContext

let fetchRequest = NSFetchRequest(entityName: EnityName”)

let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

let persistCor:NSPersistentStoreCoordinator = appDelegateObject.persistentObject
 do {
        try persistCor.executeRequest(deleteRequest, withContext: manageObject)
        try manageObject.save()
    } catch {
        print(error?.localizedDescription)
    }

1

ডিবিতে সমস্ত বস্তুর দ্রুত মুছে ফেলা :

func purgeAllData() {
    let uniqueNames = persistentContainer.managedObjectModel.entities.compactMap({ $0.name })

    uniqueNames.forEach { (name) in
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: name)
       let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
         do {
        try persistentContainer.viewContext.execute(batchDeleteRequest)
      } catch {
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
      }
   }
 }

0

ডেভ দেলংসের সুইফ্ট ২.০ উত্তর আমার জন্য ক্র্যাশ করছিল (আইওএস 9 এ)

তবে এটি কাজ করেছে:

let fetchRequest = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    do {
        try managedObjectContext.executeRequest(deleteRequest)
        try managedObjectContext.save()
    }
    catch let error as NSError {
       // Handle error
    }

0

আইওএস 9 'এনএসব্যাচডিলিটরেক্সেস্ট' সহ সুইফ্ট 3 সমাধান এবং 'এনএসম্যানেজডঅবজেক্টকন্টেক্সটেক্সট' এর এক্সটেনশন হিসাবে প্রয়োগ করা পূর্ববর্তী আইওএস সংস্করণগুলিতে ফলব্যাক। অ্যাপল রেফারেন্স https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html

extension NSManagedObjectContext {
    func batchDeleteEntities<T: NSManagedObject>(ofType type: T.Type) throws {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: type.self))
        if #available(iOS 9.0, *) {
            let request = NSBatchDeleteRequest(fetchRequest: fetchRequest)
            let result = try execute(request) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey: objectIDArray]
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
            }
        } else {
            fetchRequest.includesPropertyValues = false
            let results = try fetch(fetchRequest)
            if let actualResults = results as? [NSManagedObject], !actualResults.isEmpty {
                actualResults.forEach { delete($0) }
            }
        }
    }
}

0

যদি ন্যূনতম আইওএস 9.0 হয় তবে একাধিক রেকর্ড মুছতে NSBatchDeleteRequest ব্যবহার করুন। যদি ব্যাকগ্রাউন্ড থ্রেড থাকে তবে এনএস ম্যানেজডঅবজেক্ট কনটেক্সট সম্পাদন করুন রেকর্ড পেতে NSFetchRequest ব্যবহার করুন এবং লুপের জন্য সমস্ত রেকর্ড মুছুন এবং মুছে ফেলার পরে একবার সংরক্ষণ করুন।


0

আইওএস 11.3 এবং সুইফট 4.1 এ

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest )
        batchDeleteRequest.resultType = .resultTypeCount
        do {
            let batchDeleteResult = try dataController.viewContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
            print("The batch delete request has deleted \(batchDeleteResult.result!) records.")
            dataController.viewContext.reset() // reset managed object context (need it for working)
        } catch {
            let updateError = error as NSError
            print("\(updateError), \(updateError.userInfo)")
        }

এক্সিকিউট করার পরে আপনাকে কল রিসেট করতে হবে। যদি তা না হয় তবে এটি টেবিল দৃশ্যে আপডেট হবে না।


0
    func deleteAll(entityName: String) {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    deleteRequest.resultType = .resultTypeObjectIDs
    guard let context = self.container?.viewContext
        else { print("error in deleteAll")
            return }

    do {
        let result = try context.execute(deleteRequest) as? NSBatchDeleteResult
        let objectIDArray = result?.result as? [NSManagedObjectID]
        let changes: [AnyHashable : Any] = [NSDeletedObjectsKey : objectIDArray as Any]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
    } catch {
        print(error.localizedDescription)
    }
}

0

সত্তার নাম সুইফট 3+, এক্সকোড 10+ হিসাবে কোনও স্ট্রিং ছাড়াই ওওপি উপায়

func batchDelete<T>(in context: NSManagedObjectContext, fetchRequest: NSFetchRequest<T>) throws {
    guard let request = fetchRequest as? NSFetchRequest<NSFetchRequestResult> else {
        throw ErrorService.defaultError
    }
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
    do {
        try context.execute(batchDeleteRequest)
    } catch {
        throw error
    }
}

তারপরে কেবল ডু / ক্যাচ ব্লকে কল করুন

    let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
    do {
        let data = try context.fetch(fetchRequest)
        if data.count > 0 {
            try self.batchDelete(in: context, fetchRequest: fetchRequest)
        }
    } catch {
        // throw error
    }

-1

সুইফট ২.০ এ:

func deleteAllData(entity: String)
{
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: entity)
    fetchRequest.returnsObjectsAsFaults = false

    do 
    {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            managedContext.deleteObject(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all data in \(entity) error : \(error) \(error.userInfo)")
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.