2013-07-12 35 views
2

我一直在研究一個應用程序,用戶每天輸入存儲在覈心數據中的數據(兩個屬性爲NSNumber,另一個爲NSDate),我希望通過允許用戶通過按鈕單擊從外部文件(如csv或任何其他支持的格式)導入數據。關於如何有效地進行此操作的任何建議?iOS:如何使用下載的CSV填充CoreData

謝謝。

編輯:只需將csv文件的屏幕截圖以及csv解析器的輸出添加爲NSArray即可。基本上需要單獨獲取屬性並將它們存儲在按鈕單擊的核心數據中。

- 輸入文件作爲CSV:

enter image description here

- 示例CSV解析器輸出(NSArray的):

enter image description here

+1

您打算如何將CSV文件放到設備上並放到應用可以看到的地方? –

+0

我在想也許會用itunes取得它 –

回答

2

我最近需要做類似的事情。

我的項目團隊的一些成員想要將我們的應用原型展示給潛在客戶,但希望向每個客戶展示不同的數據。我們通過讓我們的項目團隊成員在與客戶見面之前創建自己的測試數據來解決這個問題。

我通過創建示例.csv文件並將其分發給項目團隊中的其他人來實現此目的。他們用他們自己的測試數據填充它並使用iTunes文件共享將.csv測試數據文件放到設備上。

加載時,應用程序掃描其Documents目錄中的測試數據文件。如果存在,它將解析.csv文件並保留到數據庫。

對於CSV解析,我用大衛德隆的CHCSVParser:https://github.com/davedelong/CHCSVParser

的大量幫助,可以用設置iTunes的文件共享爲您的應用程序。如果您需要Google快速查找本教程(http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app)應該會幫助您。

編輯 - 添加在存儲核心數據

你在你的,你存儲一個NSNumber和NSDate的原帖說,從數據的.csv幫助。以此爲起點,你可能會有一個。以下表格CSV文件:

+----------------+--------------+ 
+ NSNumberColumn | NSDateColumn | 
+----------------+--------------+ 
+  1  | 2013-05-15 | 
+  2  | 2013-06-15 | 
+  3  | 2013-07-15 | 
+----------------+--------------+ 

假設從CSV解析器的輸出是NSArrays的一個NSArray,可以按如下創建核心數據對象:

我會創建一對夫婦宏爲的列數:

#define NSNumberColumn 0 
#define NSDateColumn 1 

然後在.csv文件中的行迭代:

NSArray *rows = [NSArray arrayWithContentsOfCSVFile:pathToFile]; //CHCSVParser specific parsing method 
for (NSArray *row in rows) 
{ 
    NSString *numberString = [parsedCsvRow objectAtIndex:NSNumberColumn]; 
    NSString *dateString = [parsedCsvRow objectAtIndex:NSDateColumn]; 

    NSNumber *number = // parse numberString to an NSNumber. Plenty of other posts on achieving this. 
    NSDate *date = // parse NSDate from dateString. Plenty of other posts on achieving this. 

    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSManagedObject *myCoreDataObject = [NSEntityDescription insertNewObjectForEntityForName:@"MyCoreDataObject" inManagedObjectContext:context]; 
    [myCoreDataObject setValue:number forKey:@"NSNumberColumn"]; 
    [myCoreDataObject setValue:date forKey:@"NSDateColumn"]; 
    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
} 

注:爲簡潔起見,輸入驗證和空值檢查已被忽略。我也冒昧組成你的NSManagedObject屬性名稱,這將需要更新。上面的代碼應該分成更合適的類結構。

我現在不在Mac上,所以很遺憾我無法檢查這是否正常工作。

希望有所幫助。

+0

感謝您的幫助,我研究了itune集成部分,現在我需要弄清楚如何將csv數據預先加載到核心數據實體中,以便每次我在應用程序中調用詳細視圖時出現 –

+0

編輯原始帖子,詳細介紹如何將.csv數據添加到Core Data實體,希望它有所幫助。 –

+0

你好,我有以下格式的文件,並嘗試使用csvparser(https://github.com/ha-minh-vuong/CSVParser)csv文件的屏幕截圖在問題中的編輯。我不確定它是否與你給的代碼一起工作(你是否測試過它?)。在任何情況下檢查編輯更新。謝謝 –

0

嘗試使用的plist或JSON,它們已經在iOS上支持而不是在CSV上。 CSV需要第三方解析器。使用json或plist,你只需要遍歷集合的元素來創建持久存儲。如果你只有CSV,你可以使用不同的免費工具進行中間轉換,你可以在互聯網上免費找到,然後添加到你的包或發佈到您的網站。

+0

我實際上用json嘗試過,它的靈活性很強,但我只是想爲普通用戶進一步考慮將數據轉儲到應用程序中,最簡單的格式就是這樣做。 –

+0

好點,所以將需要類似的東西https://github.com/ha-minh-vuong/CSVParser – Andrea

+0

okey我會盡力回到問題 –

0

以下是當您已經解析了CSV文件並準備在Objective-C中使用數據時的操作。

  1. 爲導入創建單獨的上下文。您不知道數據有多大,因此您可能不想在導入時阻止其中一個現有上下文。

  2. 遍歷解析數據中的條目並插入從每個條目配置的新託管對象。

  3. 每個200,500或1000個條目(對於每個人都不同,您需要測試哪些最適合您)保存上下文,並在需要時發佈已批量導入的通知。

  4. 爲了減少內存,重置上下文並忘記您在此導入上下文中創建的所有對象。

  5. 循環結束後,不要忘記保存上一次。

現在您如何將數據帶入另一個上下文中,比如UI上下文?

這取決於你組織核心數據堆棧的方式。例如,可以將導入上下文配置爲UI上下文的子項。在這種情況下,每次保存到導入上下文後,這些更改將被推送到UI上下文(並且不要忘記保存UI上下文以便進一步推送更改)。

但是這不是最有效的方法,因爲UI上下文(它是主線程上下文)涉及導入,並且在阻塞它的UI線程上完成了其他工作。我建議不是作爲孩子創建導入上下文,而是直接連接到持久存儲協調器。在這種情況下,要對UI上下文進行更改,您需要在每次保存後調用mergeChangesFromContextDidSaveNotification:方法,或者在每次保存後最後在UI上下文中重新提取。後者在UI上下文中更容易,尤其是在NSFetchedResultsController上(如果使用它),因爲它不需要逐一重播更新對象。

+0

我明白這個算法,我只是不夠精通iOs處理這個程序化..... –