لماذا لا يقوم كائن Realm الخاص بي بحفظ القيم المخزنة؟

StackOverflow https://stackoverflow.com//questions/25026677

  •  21-12-2019
  •  | 
  •  

سؤال

كنت أتصفح المكان بحثًا عن حل لتنفيذ تخزين صغير للبيانات دون اتصال بالإنترنت في أحد تطبيقاتي والذي سيكون سهلاً وسريع الاستخدام.على أي حال، جئت عبر مملكة لفعل هذا.ولكن، أواجه مشكلة تتمثل في أنه في كل مرة أقوم فيها بتشغيل تطبيقي، يكون المحتوى الموجود في قاعدة البيانات خاليًا.

أفعل كل التخصيص وأتصل بـ startWriteTransaction طريقة.قم بتعيين قيمة متغير قاعدة البيانات الخاصة بي.ثم أقوم بإضافة الكائن إلى مملكة وأخيرا CommitWriteTransaction.

لذلك، أفعل NSLog لمعرفة ما إذا تم تعيين القيمة بالفعل بشكل صحيح (بعد تحديثها داخل تطبيقي).ولكن عندما أغلقت تطبيقي أو أوقفته وأقوم بتشغيله مرة أخرى في جهاز محاكاة xcode iphone5.أحاول تعيين القيمة من قاعدة البيانات في طريقة viewDidLoad إلى متغير عام في تطبيقي.الذي أقوم بإجراء NSLog للتحقق مما إذا كانت القيمة موجودة إما في قاعدة البيانات الخاصة بي أو في المتغير العام ولكن يتم عرضها على أنها فارغة، مما يعني أنه لا يتم تخزينها/حفظها.

هذا هو الكود ..

@interface iReceiptDataBase : RLMObject

@property NSString* receiptNo;

@end

RLM_ARRAY_TYPE(iReceiptDataBase)

@implementation iReceiptDataBase

@end

//******** View Controller Implementation ************

- (void)viewDidLoad {

    self.realm = [RLMRealm defaultRealm]; // property type RLMRealm
    [realm beginWriteTransaction];

    self.myDataBase = [[iReceiptDataBase alloc] init]; // property type iReceiptDataBase
    receiptNumber = [myDataBase.receiptNo intValue];

    NSLog(@"In my realm database(first call) -> %@", myDataBase.receiptNo);

    NSLog(@"In my local app(first call) -> %d", receiptNumber);

}

-(void)drawPDF:(NSString*)fName {

    receiptNumber += 1; // property type int

    myDataBase.receiptNo = [NSString stringWithFormat:@"%d", receiptNumber];

    NSLog(@"In my realm database(second call) -> %@", myDataBase.receiptNo);

}

- (void)viewWillDisappear:(BOOL)animated {

    [realm addObject:myDataBase];

    [realm commitWriteTransaction];

}

وسأأخذ في الاعتبار أيضًا أي خيارات أخرى لتحقيق ذلك.شكرًا!

*****تحديث!** هذا ما حصلت عليه في الاختبار الذي قمت بتغييره startWriteTransaction و CommitWriteTransaction في كلتا الطريقتين، ولكن لا يزال لا يعمل.إنه يحصل على القيمة التي أقدمها داخل تطبيقي ولكن عندما أقوم بالوصول مرة أخرى، فإنه لا يسحب/يجلب تلك القيمة من قاعدة البيانات إذا تم تخزينها على الإطلاق..

Screenshot of Xcode 6 showing NSLog and part of the code

هل كانت مفيدة؟

المحلول

المشكلة في كائن المجال الخاص بك هي أنك لا تستعلم عن المجال الخاص بالكائن الخاص بك.بل أنت تقوم فقط بتخصيص جديد iReciptDataBase هدف.ستحتاج أولاً إلى إضافة خاصية إلى هذا الكائن حتى تتمكن من الاستعلام عنه، شيء من هذا القبيل databaseId يظهر هنا:

@interface iReceiptDatabase : RLMObject
@property NSString *receiptNo;
@property NSString *databaseId;
@end

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)

ثم في viewDidLoad، تقوم أولاً بالاستعلام عن ملف المجال لكائن موجود، وبعد ذلك فقط بعد عدم العثور عليه، يمكنك تخصيصه:

- (void)viewDidLoad {
    [super viewDidLoad];

    RLMRealm *realm = [RLMRealm defaultRealm];
    iReceiptDatabase *myDatabase = [[iReceiptDatabase objectsWhere:@"databaseId = '1'"] firstObject];

    if(!myDatabase) {
        [realm beginWriteTransaction];
        myDatabase = [[iReceiptDatabase alloc] init];
        myDatabase.receiptNo = @"1";
        myDatabase.databaseId = @"1";
        [realm addObject:myDatabase];
        [realm commitWriteTransaction];
    }

    //...
}

نصائح أخرى

تخميني سيكون viewWillDisappear لا يتم استدعاؤه أبدًا.أوصي بتنفيذ معاملة الكتابة بعد كل تغيير في بياناتك بدلاً من ترك المعاملة مفتوحة طالما أن العرض مرئي - بدلاً من إضافة الكائن في النهاية، يمكنك تغيير طرقك الأخرى لتنفيذ البيانات:

- (void)viewDidLoad {

    self.realm = [RLMRealm defaultRealm]; // property type RLMRealm

    [realm beginWriteTransaction];
    self.myDataBase = [[iReceiptDataBase alloc] init]; // property type iReceiptDataBase
    [realm addObject:myDataBase];
    [realm commitWriteTransaction];

    receiptNumber = [myDataBase.receiptNo intValue];

    NSLog(@"In my realm database(first call) -> %@", myDataBase.receiptNo);
    NSLog(@"In my local app(first call) -> %d", receiptNumber);
}

-(void)drawPDF:(NSString*)fName {

    receiptNumber += 1; // property type int

    [realm beginWriteTransaction];
    myDataBase.receiptNo = [NSString stringWithFormat:@"%d", receiptNumber];
    [realm commitWriteTransaction];

    NSLog(@"In my realm database(second call) -> %@", myDataBase.receiptNo);
}

سأفكر أيضًا في تخزين رقم الإيصال باعتباره int في نموذج البيانات الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top