2017-04-08 58 views
0

我有一個'CLLocationCoordinate2D'類型的數組。例如, 這是我的數據看起來像:將CLLocationCoordiante2D數組保存到核心數據?

[__C.CLLocationCoordinate2D(緯度:60.24971706534604,經度:13.748807609081268),__C.CLLocationCoordinate2D(緯度:60.2463096103141,經度:14.025525748729706),__C.CLLocationCoordinate2D(緯度:60.190718087002963 ,經度:13.781766593456268)]

我怎麼能把這個保存到核心數據?

+0

可能的重複[如何在Core Data中存儲特定的格式數組?](http://stackoverflow.com/questions/43293084/how-can-i-store-a-specific-format-array-in -core-data) – pbasdf

+0

實際上這是我的線程,但是這次我正在具體詢問這個問題。 – konyv12

回答

1

您需要在對象模型中將座標保存爲Double。從那裏,當你需要一個座標,你可以在擴展創建的方法爲您NSManagedObject包含返回CLLocation對象的X和Y座標:

func location() -> CLLocation { 
    return CLLocation(latitude: self.coordinateX, longitude: self.coordinateY) 
} 
+0

但它仍然是一個CLLocation類型,不能保存爲Double? – konyv12

+0

我不認爲你可以保存一個NSManagedObject的CLLocationObject,但你可以附加一個雙重託管的對象。所以你只需要在你的託管對象中保存CLLocation所需的參數即Double。然後,當你需要一個CLLocation時,你只需使用'myManagedObject.location()'來獲得它 – Adrian

+0

真棒,謝謝 – konyv12

1

如果您使用的這些座標的尋路目的(座標在路徑中),對數組進行字符串編碼可能是一個非常好的方法。這可能太複雜,無法實現,但我建議看看Google的Encoded Polylines

想法是你有一個座標數組(lat/long),它將整個數組轉換爲一個單獨的字符串。

如果您有任何機會在項目中使用GoogleMaps,那麼這將是最簡單的方法。比方說,你創建一個GMSPath -object這樣的:

let path = GMSMutablePath() 
path.add(CLLocationCoordinate2D) 
path.add(CLLocationCoordinate2D) 
path.add(CLLocationCoordinate2D) 

後來乾脆path.encodedPath()獲得路徑的字符串表示。

在他們的榜樣,這些點:(38.5, -120.2), (40.7, -120.95), (43.252, -126.453)都變成了這樣一個字符串:

_p~iF~ps|U_ulLnnqC_mqNvxq`@ 

如果您在數據庫中存儲此字符串,並要再次提取它們,你可以簡單地說

let path = GMSPath(fromEncodedPath: encodedString) 

這非常適合存儲在數據庫中,或通過API發送。 然後,它可能不適合您的使用。

+0

真棒替代。 – Adrian

0

兩種方式來處理這個問題:

  1. 最好的辦法是使用NSEncoder機制,然後存儲對象爲核心的數據項。
  2. 另一種方法是使用Coredata參數數據類型作爲可變形的,並將對象直接存儲爲CoreLocation。有用。

我更喜歡第一種方式,因爲它可以讓您讀取對象並在調試時按需打印。