2016-02-22 14 views
5

मेरे एप्लिकेशन में मेरे पास ऑब्जेक्ट्स हैं जो कुछ वैकल्पिक डेटा स्टोर कर सकते हैं। ऐसी दो वस्तुएं हैं - जैसे, यह अद्वितीय और ऐसा होना चाहिए, जो अद्वितीय होने की आवश्यकता नहीं है।मूल डेटा सेट के साथ कोर डेटा सेव करें

जो अद्वितीय हैं, उनमें अतिरिक्त विशेषता है - uuid - जिसके द्वारा विशिष्टता की जांच की जाती है।

गैर-अद्वितीय कहा जाता है, उदाहरण के लिए StoreObject और अद्वितीय UniqueStoreObject। उस यूयूआईडी विशेषता के अलावा वे पूरी तरह से समान हैं।

तो, StoreObject कोई मूल इकाई नहीं है। UniqueStoreObject स्टोर ऑब्जेक्ट पर सेट मूल इकाई के साथ इकाई है। जैसा कि मैंने कहा - दोनों इकाइयों द्वारा वर्णित वस्तुओं को एक बैकएंड में एक साथ पूरा किया जा सकता है।

लेकिन, अगर मैं NSManagedContext, जिसमें मैं StoreObject ऑब्जेक्ट को बचाने की कोशिश, मैं कोर डाटा से त्रुटि लॉग संदेशों को बचाने के मिल -

CoreData: error: (1) I/O error for database at *path to base*/MapStorageTest.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 
Core Data: error: -executeRequest: encountered exception = I/O error for database at *path to base*/MapStorageTest.sqlite. SQLite error code:1, 'near "WHERE": syntax error' with userInfo = { 
NSFilePath = "*path to base*/MapStorageTest.sqlite"; 
NSSQLiteErrorDomain = 1; 
} 

अजनबी बनाने के लिए, इस व्यवहार स्थिर नहीं है। यदि यह एक बार दिखाई देता है - यह अगले एप्लिकेशन लॉन्च पर दिखाई देगा। लेकिन, अगर मैं, उदाहरण के लिए, अनन्य फ़ील्ड, या किसी अन्य इकाई को हटाएं (यहां दो का उल्लेख नहीं किया गया है), या उन इकाइयों में से एक को फिर से बनाएं (इसे हटाएं और एक्सकोड प्रबंधित मॉडल टूल में नया लिखें) यह गायब हो सकता है।

फ़ील्ड की वैकल्पिकता, या प्रबंधित ऑब्जेक्ट टूल में अद्वितीय बाधाओं से कोई संबंध नहीं मिला। केवल एक चीज जिसे मैं पकड़ सकता हूं - इस स्टोर ऑब्जेक्ट इकाई में बच्चे की इकाई होनी चाहिए और सहेजने से पहले संदर्भ में तुरंत तत्काल होना चाहिए।

जब मैं कोई गुण और StoreObject संस्था की संतान है कि गैर-अद्वितीय दुकानों के लिए अलग इकाई बनाई - समस्या सिर्फ गायब हो गई

अद्यतन

टिप्पणियों में कोड उदाहरण के लिए कहा गया है। यहां तक ​​कि सबसे सरल स्थिति इस बग का कारण बन सकती

//Everything happens in viewDidLoad method 

//Context is created by Xcode-genereate code. It has main queue concurency type 
NSManagedObjectContext *ctx = [(AppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
NSManagedObject *storeObject = [NSEntityDescription insertNewObjectForEntityForName:@"StoreObject" 
                  inManagedObjectContext:ctx]; 
[ctx save:&err]; //Here I get those error messages and error object is returned 

अद्यतन 2

यहाँ है कि मैं क्या SQLDebug तर्क के साथ मिलता है 1

2016-02-25 22:59:05.438 ParentEntityCheck[31701:11387091] CoreData: annotation: Connecting to sqlite database file at "*path to base*/ParentEntityCheck.sqlite" 
2016-02-25 22:59:05.441 ParentEntityCheck[31701:11387091] CoreData: annotation: creating schema. 
2016-02-25 22:59:05.441 ParentEntityCheck[31701:11387091] CoreData: sql: pragma page_size=4096 
2016-02-25 22:59:05.441 ParentEntityCheck[31701:11387091] CoreData: sql: pragma auto_vacuum=2 
2016-02-25 22:59:05.445 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.445 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 
2016-02-25 22:59:05.446 ParentEntityCheck[31701:11387091] CoreData: sql: CREATE TABLE ZSTOREOBJECT (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZLASTLOAD TIMESTAMP, ZSTORECAPACITY VARCHAR, ZSTORENAME VARCHAR, ZUUID VARCHAR UNIQUE) 
2016-02-25 22:59:05.447 ParentEntityCheck[31701:11387091] CoreData: sql: CREATE INDEX IF NOT EXISTS ZSTOREOBJECT_Z_ENT_INDEX ON ZSTOREOBJECT (Z_ENT) 
2016-02-25 22:59:05.447 ParentEntityCheck[31701:11387091] CoreData: annotation: Creating primary key table. 
2016-02-25 22:59:05.448 ParentEntityCheck[31701:11387091] CoreData: sql: CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER) 
2016-02-25 22:59:05.448 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(1, 'StoreObject', 0, 0) 
2016-02-25 22:59:05.449 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(2, 'UniqueStoreObject', 1, 0) 
2016-02-25 22:59:05.449 ParentEntityCheck[31701:11387091] CoreData: sql: CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB) 
2016-02-25 22:59:05.450 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 
2016-02-25 22:59:05.450 ParentEntityCheck[31701:11387091] CoreData: sql: DELETE FROM Z_METADATA WHERE Z_VERSION = ? 
2016-02-25 22:59:05.450 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO Z_METADATA (Z_VERSION, Z_UUID, Z_PLIST) VALUES (?, ?, ?) 
2016-02-25 22:59:05.451 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE' 
2016-02-25 22:59:05.451 ParentEntityCheck[31701:11387091] CoreData: sql: CREATE TABLE Z_MODELCACHE (Z_CONTENT BLOB) 
2016-02-25 22:59:05.454 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO Z_MODELCACHE (Z_CONTENT) VALUES (?) 
2016-02-25 22:59:05.454 ParentEntityCheck[31701:11387091] CoreData: sql: COMMIT 
2016-02-25 22:59:05.455 ParentEntityCheck[31701:11387091] CoreData: sql: pragma journal_mode=wal 
2016-02-25 22:59:05.457 ParentEntityCheck[31701:11387091] CoreData: sql: pragma journal_mode=wal 
2016-02-25 22:59:05.457 ParentEntityCheck[31701:11387091] CoreData: sql: pragma cache_size=200 
2016-02-25 22:59:05.458 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA 
2016-02-25 22:59:05.459 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE' 
2016-02-25 22:59:05.462 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.463 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
2016-02-25 22:59:05.463 ParentEntityCheck[31701:11387091] CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
2016-02-25 22:59:05.464 ParentEntityCheck[31701:11387091] CoreData: sql: COMMIT 
2016-02-25 22:59:05.465 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.466 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO ZSTOREOBJECT(Z_PK, Z_ENT, Z_OPT, ZLASTLOAD, ZSTORECAPACITY, ZSTORENAME) VALUES(?, ?, ?, ?, ?, ?) 
2016-02-25 22:59:05.467 ParentEntityCheck[31701:11387091] CoreData: sql: UPDATE ZSTOREOBJECT SET WHERE Z_PK = ? 
2016-02-25 22:59:05.467 ParentEntityCheck[31701:11387091] CoreData: annotation: Disconnecting from sqlite database due to an error. 
2016-02-25 22:59:05.469 ParentEntityCheck[31701:11387091] CoreData: error: (1) I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 
2016-02-25 22:59:05.470 ParentEntityCheck[31701:11387091] Core Data: error: -executeRequest: encountered exception = I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' with userInfo = { 
    NSFilePath = "*path to base*/ParentEntityCheck.sqlite"; 
    NSSQLiteErrorDomain = 1; 
} 
2016-02-25 22:59:05.471 ParentEntityCheck[31701:11387091] CoreData: annotation: Connecting to sqlite database file at "*path to base*/ParentEntityCheck.sqlite" 
2016-02-25 22:59:05.471 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 
2016-02-25 22:59:05.473 ParentEntityCheck[31701:11387091] CoreData: sql: pragma journal_mode=wal 
2016-02-25 22:59:05.473 ParentEntityCheck[31701:11387091] CoreData: sql: pragma cache_size=200 
2016-02-25 22:59:05.474 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.474 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO ZSTOREOBJECT(Z_PK, Z_ENT, Z_OPT, ZLASTLOAD, ZSTORECAPACITY, ZSTORENAME) VALUES(?, ?, ?, ?, ?, ?) 
2016-02-25 22:59:05.475 ParentEntityCheck[31701:11387091] CoreData: sql: UPDATE ZSTOREOBJECT SET WHERE Z_PK = ? 
2016-02-25 22:59:05.475 ParentEntityCheck[31701:11387091] CoreData: annotation: Disconnecting from sqlite database due to an error. 
2016-02-25 22:59:05.477 ParentEntityCheck[31701:11387091] CoreData: error: (1) I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 
2016-02-25 22:59:05.477 ParentEntityCheck[31701:11387091] Core Data: error: -executeRequest: encountered exception = I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' with userInfo = { 
    NSFilePath = "*path to base*/ParentEntityCheck.sqlite"; 
    NSSQLiteErrorDomain = 1; 
} 
2016-02-25 22:59:05.488 ParentEntityCheck[31701:11387091] CoreData: annotation: Connecting to sqlite database file at "*path to base*/ParentEntityCheck.sqlite" 
2016-02-25 22:59:05.489 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 
2016-02-25 22:59:05.491 ParentEntityCheck[31701:11387091] CoreData: sql: pragma journal_mode=wal 
2016-02-25 22:59:05.491 ParentEntityCheck[31701:11387091] CoreData: sql: pragma cache_size=200 
2016-02-25 22:59:05.491 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.492 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO ZSTOREOBJECT(Z_PK, Z_ENT, Z_OPT, ZLASTLOAD, ZSTORECAPACITY, ZSTORENAME) VALUES(?, ?, ?, ?, ?, ?) 
2016-02-25 22:59:05.492 ParentEntityCheck[31701:11387091] CoreData: sql: UPDATE ZSTOREOBJECT SET WHERE Z_PK = ? 
2016-02-25 22:59:05.493 ParentEntityCheck[31701:11387091] CoreData: annotation: Disconnecting from sqlite database due to an error. 
2016-02-25 22:59:05.495 ParentEntityCheck[31701:11387091] CoreData: error: (1) I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 
2016-02-25 22:59:05.496 ParentEntityCheck[31701:11387091] Core Data: error: -executeRequest: encountered exception = I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' with userInfo = { 
    NSFilePath = "*path to base*/ParentEntityCheck.sqlite"; 
    NSSQLiteErrorDomain = 1; 
} 
2016-02-25 22:59:05.560 ParentEntityCheck[31701:11387091] CoreData: annotation: Connecting to sqlite database file at "*path to base*/ParentEntityCheck.sqlite" 
2016-02-25 22:59:05.561 ParentEntityCheck[31701:11387091] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 
2016-02-25 22:59:05.562 ParentEntityCheck[31701:11387091] CoreData: sql: pragma journal_mode=wal 
2016-02-25 22:59:05.562 ParentEntityCheck[31701:11387091] CoreData: sql: pragma cache_size=200 
2016-02-25 22:59:05.562 ParentEntityCheck[31701:11387091] CoreData: sql: BEGIN EXCLUSIVE 
2016-02-25 22:59:05.563 ParentEntityCheck[31701:11387091] CoreData: sql: INSERT INTO ZSTOREOBJECT(Z_PK, Z_ENT, Z_OPT, ZLASTLOAD, ZSTORECAPACITY, ZSTORENAME) VALUES(?, ?, ?, ?, ?, ?) 
2016-02-25 22:59:05.600 ParentEntityCheck[31701:11387091] CoreData: sql: UPDATE ZSTOREOBJECT SET WHERE Z_PK = ? 
2016-02-25 22:59:05.601 ParentEntityCheck[31701:11387091] CoreData: annotation: Disconnecting from sqlite database due to an error. 
2016-02-25 22:59:05.602 ParentEntityCheck[31701:11387091] CoreData: error: (1) I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 
2016-02-25 22:59:05.683 ParentEntityCheck[31701:11387091] Error saving ctx Error Domain=NSCocoaErrorDomain Code=256 "The file “ParentEntityCheck.sqlite” couldn’t be opened." UserInfo={NSFilePath=*path to base*/ParentEntityCheck.sqlite, NSSQLiteErrorDomain=1, NSUnderlyingException=I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error'} 
+0

इकाई विरासत को "बस काम करना चाहिए"। कोई विशेष आवश्यकता नहीं है - जैसा कि किसी अन्य उदाहरण के साथ, आपके डेटा को आपके पास किसी भी सत्यापन नियम को पारित करने की आवश्यकता है, लेकिन यह है। आपने जो वर्णन किया है उससे कोई स्पष्ट कारण नहीं है कि यह असफल क्यों होगा, इसलिए इससे मदद मिलेगी यदि आप कुछ कोड शामिल कर सकते हैं जो वास्तव में क्या हो रहा है। –

+0

सार तत्वों को तुरंत चालू नहीं किया जा सकता है। मैं – quellish

+0

@quellish की तरह कहा - StoreObject नहीं सार इकाई –

उत्तर

2

मुझे लगता है कि वहाँ दो अतिव्यापी समस्याएं हैं: प्राथमिक समस्या uuid पर विशिष्टता बाधा होने के नाते। मैंने आपके लिए एक समान सेट-अप बनाने की कोशिश की, और एकमात्र ऐसी स्थिति जिसमें मैं त्रुटि उत्पन्न कर सकता था, अगर uuid में विशिष्टता बाधा थी।

मैं आपके प्रश्न से नोट करता हूं कि आपको विश्वास नहीं है कि विशिष्टता की बाधा जटिल है, लेकिन मुझे लगता है कि यह माध्यमिक समस्या के कारण है: शुरुआत में मैं परेशान था क्योंकि एक विशिष्टता बाधा लागू करने का मेरा प्रयास काम नहीं करेगा। जबकि अपने SQLDebug uuid के लिए एक अद्वितीय विशेषता से पता चला है जब डेटाबेस बनाया गया था:

CoreData: sql: CREATE TABLE ZSTOREOBJECT (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZLASTLOAD TIMESTAMP, ZSTORECAPACITY VARCHAR, ZSTORENAME VARCHAR, ZUUID VARCHAR UNIQUE) 

मेरा ऐसा नहीं किया। सफाई के बाद, और थोड़ा सा प्रयोग करने के बाद, मुझे अंततः काम करने के लिए विशिष्टता बाधा मिली (उपरोक्त अर्थ में)।जैसे ही मैंने किया, मैंने आपको उसी त्रुटि का सामना करना शुरू कर दिया:

CoreData: sql: UPDATE ZSTOREOBJECT SET WHERE Z_PK = ? 
CoreData: annotation: Disconnecting from sqlite database due to an error. 
CoreData: error: (1) I/O error for database at *path to base*/ParentEntityCheck.sqlite. SQLite error code:1, 'near "WHERE": syntax error' 

मैंने तब बाधा को हटाने का प्रयास किया।

enter image description here

और समस्या जारी रखा। यहां तक ​​कि अगर मैंने बिल्ड को साफ किया है, तो सिम्युलेटर से ऐप हटा दिया गया है और फिर से: एक ही समस्या आई। किसी भी तरह, हालांकि डेटा मॉडल संपादक ने यूयूआईडी पर कोई बाधा नहीं दिखायी, एक भी लागू किया जा रहा था।/नष्ट कर दिया विशिष्टता की कमी

<entity name="UniqueStoreObject" representedClassName="UniqueStoreObject" parentEntity="StoreObject" syncable="YES"> 
    <attribute name="uuid" attributeType="String" syncable="YES"/> 
    <uniquenessConstraints> 
     <uniquenessConstraint> 
      <constraint value="uuid"/> 
     </uniquenessConstraint> 
    </uniquenessConstraints> 
</entity> 

स्पष्ट रूप से Xcode बस मॉडल को अद्यतन करने नहीं है जोड़ा प्रतिबिंबित करने के लिए: मैं एक्सएमएल को देखा xcdatamodeld अंदर दूर tucked, और वहाँ यह था। हालांकि, अगर आप मॉडल (जोड़ सकते हैं और उदाहरण के लिए एक विशेषता निकालने के लिए,), विशिष्टता की कमी के परिवर्तन किया जाता है के लिए एक और बदलाव करते हैं, जब टेबल बनाई गई हैं uuid के लिए अद्वितीय परिभाषा लागू किया जाता है, और त्रुटि गायब हो जाता है।

यह अपनी खुद की टिप्पणियों के साथ संगत है:

लेकिन, अगर मैं, उदाहरण के लिए, uniquing क्षेत्र, या किसी अन्य इकाई (नहीं दो यहाँ उल्लेख किया), हटा सकते हैं या उन संस्थाओं में से एक (इसे हटा पुन: और एक्सकोड प्रबंधित मॉडल उपकरण में नया लिखें) यह गायब हो सकता है।

मॉडल में अन्य संस्थाओं या विशेषताओं में किए गए परिवर्तन विशिष्टता बाधाओं को प्रभावी बनाने के लिए किसी भी बदलाव का कारण बनते हैं।

एक बार जब आप Xcode के साथ इस समस्या को हल करने, मुख्य समस्या यह स्पष्ट हो जाता है: विशिष्टता की कमी सिर्फ subentities के लिए काम करने के लिए नहीं है।

जो सब के सब

एक समाधान के बजाय एक व्याख्या है। मैं नहीं बल्कि CoreData विशिष्टता की कमी का उपयोग करने से अपने UniqueStoreObject उपवर्ग के लिए कुछ विशिष्ट कोड लगता है,। काश मैं बेहतर समाधान था, लेकिन मुझे उम्मीद है कि आप थोड़ा बेहतर सो सकते हैं ....

+0

मुझे लगता है, अब मैं बेहतर सो सकता हूं। आपका जवाब वह है जो मैं ढूंढ रहा था। मुझे मिला समाधान - कोई अतिरिक्त गुणों के साथ NonuniqueStoreObject सबेंटिटी बनाएँ और StoreObject के बजाय इसे तुरंत चालू करें। इस मामले में सबकुछ ठीक काम करता है –