我应该使用NSUserDefaults还是plist来存储数据



我将存储一些字符串(可能是10-20)。我不确定是否应该使用NSUserDefaults来保存它们,还是将它们写到plist中。什么是最佳实践?NSUserDefaults似乎代码行数更少,因此实现起来更快。

我想补充的是,这些字符串值将由用户添加/删除。

我假设是一个数组,但它也可以用于字典。

用户默认值,核心数据和Plists都可以读/写,但如果你使用plist,你需要注意你把它放在什么目录。请看下面的列表部分。

Core Data我认为这太过分了,它只是字符串。当你想持久化更复杂的对象时,应该使用它。

NSUserDefaults :

这是非常快速和容易做到的,虽然它应该只存储用户设置。将它们写入userdefaults:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize];

从userdefaults中读取

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];

Plist :

如果你的字符串要被修改,你需要写和读一个plist,但你不能写到你的应用程序的资源。

  1. 要有一个读写列表,首先找到文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 创建数组(我假设字符串是string1,…)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
    
  3. 写入文件

    [stringsArray writeToFile:stringsPlistPath atomically:YES];
    

读取列表:

  1. 查找文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 读入:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    

如果您正在存储10-20个字符串,并且正在寻找不太多的代码行,核心数据肯定是太多的开销。我建议使用列表。代码不多:

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"];
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];

iOS最终将所有NSUserDefaults数据存储到plist文件中。所以它不会影响性能,如果这是你关心的。我个人更喜欢对小数据使用NSUserDefaults,对相对较大的数据集使用plist。

注意:永远不要在NSUserDefaults中存储任何敏感信息,因为任何人都可以看到这些数据。

NSUserDefaults会将用户的首选项存储到Library/preferences文件夹中的一个文件中。理论上,它只用于存储一些应用程序/用户属性。

Plist文件对于管理单个文件非常有用。如果你需要管理更多,你应该使用Coredata。对plist文件的大小没有限制。否则,您必须小心使用plist文件,因为当您需要保存或读取它时,文件的整个内容将加载到内存中。

使用.plist

    使用Xcode创建plist

写一个值到plist

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"settings" withExtension:@"plist"];
 NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
 [dict setValue:@"value" forKey:@"key"];
 [dict writeToURL:plistURL atomically:YES];

从plist中读取值

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
NSString *myValue = [dict valueForKey:@"key"];

这取决于你想要存储什么以及为什么。NSUserDefaults用于存储用户首选项。你可以尝试用它做其他事情,但你可能不应该。

否则,如果您的需求很简单,则plist文件非常直接。您还可以使用核心数据或提出自己的文件格式。一般来说,我对简单的任务使用plist,然后对更复杂的任务使用核心数据。

如果字符串不仅仅是可以在NSUserDefaults中的用户设置,那么使用plist是存储字符串的好选择。如前所述,当使用plist时,你必须将plist存储在Documents目录中以便写入,因为你不能写入自己的应用程序资源。当我第一次了解到这一点时,我不清楚你自己的应用程序的Bundle目录和Documents目录在哪里,所以我想我在这里发布示例代码,首先复制一个名为"Strings"的plist。plist"(你已经在你自己的应用程序的Bundle目录中有了)到Documents目录,然后向它写入并从中读取。

// Make a path to the plist in the Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *stringsPlistPathIndDoc = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
// Make a path to the plist in your app's Bundle directory
NSString *stringsPlistPathInBundle = [[NSBundle mainBundle] pathForResource:@"Strings" ofType:@".plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
// Check first that you haven't already copied this plist to the Documents directory
if (![fileManager fileExistsAtPath:stringsPlistPathIndDoc])
{
    NSError *error;
    // Copy the plist from the Bundle directory to the Documents directory 
    [fileManager copyItemAtPath:stringsPlistPathInBundle toPath:stringsPlistPathIndDoc error:&error];
}
// Write your array out to the plist in the Documents directory
NSMutableArray *stringsArray = [[NSMutableArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil]; 
[stringsArray writeToFile:stringsPlistPathIndDoc atomically:YES];
// Later if you want to read it:
stringsArray = [[NSMutableArray alloc] initWithContentsOfFile:stringsPlistPathIndDoc];

NSUSerDefaults确实可以快速实现,但随着应用程序的增长,您想要存储越来越多的文件,我直接使用plist文件。

大多数情况下,人们想要存储一些东西的列表,这里是我分享的如何用NSDictionary做这个。这并不需要您首先创建一个plist文件,它将在第一次创建保存一些

xcode 7 beta, Swift 2.0

储蓄

func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool
{
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let docuDir = paths.firstObject as! String
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
    let filemanager = NSFileManager.defaultManager()
    let array = NSMutableArray()        
    
    for var i = 0 ; i < items.count ; i++
    {
        let dict = NSMutableDictionary()
        let ItemCode = items[i].ItemCode as NSString
        
        dict.setObject(ItemCode, forKey: "ItemCode")
        //add any aditional..
        array[i] = dict
    }
    
    let favoritesDictionary = NSDictionary(object: array, forKey: "favorites")
    //check if file exists
    if(!filemanager.fileExistsAtPath(path))
    {
        let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil)
         if(created)
         {
             let succeeded = favoritesDictionary.writeToFile(path, atomically: true)
             return succeeded
         }
         return false
    }
    else
    {
        let succeeded = notificationDictionary.writeToFile(path, atomically: true)
        return succeeded
    }
}

来自文档的小提示:

NSDictionary.writeToFile(路径:自动)

该方法在写入文件之前递归地验证所有包含的对象是否为属性列表对象(NSData, NSDate, NSNumber, NSString, NSArrayNSDictionary的实例),如果所有对象都不是属性列表对象,则返回NO,因为生成的文件将不是有效的属性列表。

所以无论你在dict.SetObject()设置什么,都应该是上面提到的类型之一。

加载

private let ItemFavoritesFilePath = "ItemFavorites.plist"
func LoadItemFavorites() -> Array<ItemFavorite>
{
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let docuDir = paths.firstObject as! String
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
    let dict = NSDictionary(contentsOfFile: path)
    let dictitems : AnyObject? = dict?.objectForKey("favorites")
    
    var favoriteItemsList = Array<ItemFavorite>()
    
    if let arrayitems = dictitems as? NSArray
    {
        for var i = 0;i<arrayitems.count;i++
        {
            if let itemDict = arrayitems[i] as? NSDictionary
            {
                let ItemCode = itemDict.objectForKey("ItemCode") as? String
                //get any additional
                
                let ItemFavorite = ItemFavorite(item: ItemCode)
                favoriteItemsList.append(ItemFavorite)
            }
        }
    }
    
    return favoriteItemsList
}

推荐使用Core data来持久化这样的数据。虽然NSUserDefaults可以用来存储或多或少的任何东西,但它只应该用于存储首选项。

最新更新