如何停止覆盖数据

Posted

技术标签:

【中文标题】如何停止覆盖数据【英文标题】:How to stop overwriting data 【发布时间】:2013-05-05 07:25:09 【问题描述】:

我正在尝试在我的 ios 应用中保存一些数据。我使用以下代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourPlist.plist"];

//inserting data
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:categoryField.text forKey:@"Category"];
[dict setValue:nameField.text forKey:@"Name"];
[dict setValue:eventField.text forKey:@"Event"];

NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:dict];
[arr writeToFile: path atomically:YES];


//retrieving data
NSMutableArray *savedStock = [[NSMutableArray alloc] initWithContentsOfFile: path];
for (NSDictionary *dict in savedStock) 
     NSLog(@"my Note : %@",dict);

但是 NSLog 只向我显示了最后的数据...我想我正在覆盖这里..我不明白为什么!

如何在不覆盖的情况下继续将字典保存在数组中?有什么想法吗?

【问题讨论】:

我已经给你之前的question 提供了一个answer,它负责覆盖。以防你没有检查。 我知道并且我正在强烈重新考虑将已接受的答案更改为您的答案。那段代码似乎更容易,这就是我选择它的原因。 我不是要你接受它,另一个很简单,因为它没有处理所有覆盖,易用性,存储封装等。我建议你尝试一下.您可以将 plist 保存为字典,它将模型对象转换为字典并在回调时执行相反的操作。 【参考方案1】:

由于您正在制作模型对象,因此最好在其中包含 save、remove、findAll、findByUniqueId 类型的逻辑。将使模型对象的工作变得非常简单。

@interface Note : NSObject

@property (nonatomic, copy) NSString *category;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *event;

- (id)initWithDictionary:(NSDictionary *)dictionary;

/*Find all saved notes*/
+ (NSArray *)savedNotes;

/*Saved current note*/
- (void)save;

/*Removes note from plist*/
- (void)remove;

保存笔记

Note *note = [Note new];
note.category = ...
note.name = ...
note.event = ...

[note save];

从保存的列表中删除

//Find the reference to the note you want to delete
Note *note = self.savedNotes[index];
[note remove];

查找所有已保存的笔记

NSArray *savedNotes = [Note savedNotes];

Source Code

【讨论】:

【参考方案2】:

替换:

NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:dict];
[arr writeToFile: path atomically:YES];

与:

NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile: path];
[arr addObject:dict];
[arr writeToFile: path atomically:YES];

【讨论】:

我做到了。现在它不打印任何东西。连最后一个都没有。【参考方案3】:

您需要先读入数据,然后将新字典追加到旧字典。所以先读取文件,然后追加新字典,然后保存。

完整代码:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:categoryField.text forKey:@"Category"];
[dict setValue:nameField.text forKey:@"Name"];
[dict setValue:eventField.text forKey:@"Event"];

[self writeDictionary:dict];

- (void)writeDictionary:(NSDictionary *)dict

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourPlist.plist"];

    NSMutableArray *savedStock = [[NSMutableArray alloc] initWithContentsOfFile: path];
    if(!savedStock) 
        savedStock = [[[NSMutableArray alloc] initiWithCapacity:1];
    
    [savedStock addObject:dict];

    // see what';s there now
    for (NSDictionary *dict in savedStock) 
         NSLog(@"my Note : %@",dict);
    
    // now save out
    [savedStock writeToFile:path atomically:YES];

【讨论】:

谢谢大卫。我知道这就是我的问题背后的逻辑,但我这里有一个编码问题,我认为不是架构问题。

以上是关于如何停止覆盖数据的主要内容,如果未能解决你的问题,请参考以下文章

如何停止/覆盖 Jquery TimeOut 函数?

如何在覆盖 UIView 之前停止幻灯片过渡到 Second VC?

如何在iOS6中停止状态栏覆盖导航栏

如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()

如何停止 cPanel 升级覆盖我的自定义 exim.conf 文件

旋转视图时如何在ios 7中停止状态栏覆盖ping