我正在开发,其中用户创建了一个具有3场的情况下的应用程序:
类别,名称,事件。 用户给他进场后,我有一个保存按钮,将节省他的数据以供将来参考。 然后,当他打开应用程序再次中的数据会在一个表格视图中显示。
究竟怎样才能在iOS版“拯救”的数据? 我知道的NSUserDefaults的,但我敢肯定这是不是在这个例子中的方式。
我已经做了到目前为止:
我创建了一个“注意”类的类别,名称,事件。
我保存按钮的代码如下所示:
- (IBAction)save:(id)sender {
//creating a new "note" object
Note *newNote = [[Note alloc]init];
newNote.category = categoryField.text;
newNote.name = nameField.text;
newNote.event = eventField.text;
// do whatever you do to fill the object with data
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:newNote];
/*
Now we create the path to the documents directory for your app
*/
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
/*
Here we append a unique filename for this object, in this case, 'Note'
*/
NSString* filePath = [documentsDirectory stringByAppendingString:@"Note"];
/*
Finally, let's write the data to our file
*/
[data writeToFile:filePath atomically:YES];
/*
We're done!
*/
}
这是为了保存一个事件的正确方法? 我怎样才能找回现在我写的?
其次,如果我再次运行该代码我会覆盖数据,或创建新的项目?
我想看看我怎么可以让每一次新的条目。
此外,我想删除从我提出的表格中的事件,所以我想看看如何删除会的工作。
我的“注意”对象看起来像这样:
@interface Note : NSObject <NSCoding> {
NSString *category;
NSString *name;
NSString *event;
}
@property (nonatomic, copy) NSString *category;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *event;
@end
尝试
//Note.h
#define kNoteCategory @"Category"
#define kNoteName @"Name"
#define kNoteEvent @"Event"
@interface Note : NSObject
@property (nonatomic, copy) NSString *category;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *event;
- (id)initWithDictionary:(NSDictionary *)dictionary;
+ (NSArray *)savedNotes;
- (void)save;
//Note.m文件
- (id)initWithDictionary:(NSDictionary *)dictionary
{
self = [super init];
if (self)
{
self.category = dictionary[kNoteCategory];
self.name = dictionary[kNoteName];
self.event = dictionary[kNoteEvent];
}
return self;
}
+ (NSString *)userNotesDocumentPath
{
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"UserNotes.plist"];
return documentsPath;
}
+ (NSArray *)savedNotes
{
NSString *documentsPath = [self userNotesDocumentPath];
NSArray *savedNotes = [NSArray arrayWithContentsOfFile:documentsPath];
NSMutableArray *savedUserNotes = [@[] mutableCopy];
for (NSDictionary *dict in savedNotes) {
Note *note = [[Note alloc]initWithDictionary:dict];
[savedUserNotes addObject:note];
}
return savedUserNotes;
}
- (NSDictionary *)userNoteDictionary
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
if (self.category) {
dict[kNoteCategory] = self.category;
}
if (self.name) {
dict[kNoteName] = self.name;
}
if (self.event) {
dict[kNoteEvent] = self.event;
}
return dict;
}
- (void)saveUserNotesToPlist:(NSArray *)userNotes
{
NSMutableArray *mutableUserNotes = [@[] mutableCopy];
for (Note *note in userNotes) {
NSDictionary *dict = [note userNoteDictionary];
[mutableUserNotes addObject:dict];
}
NSString *documentsPath = [Note userNotesDocumentPath];
[mutableUserNotes writeToFile:documentsPath atomically:YES];
}
#pragma mark - Save
- (void)save
{
NSMutableArray *savedNotes = [[Note savedNotes] mutableCopy];
[savedNotes addObject:self];
[self saveUserNotesToPlist:savedNotes];
}
保存说明
- (IBAction)save:(id)sender {
//creating a new "note" object
Note *newNote = [[Note alloc]init];
newNote.category = categoryField.text;
newNote.name = nameField.text;
newNote.event = eventField.text;
//Saves the note to plist
[newNote save];
//To get all saved notes
NSArray *savedNotes = [Note savedNotes];
}
源代码
您可以使用NSKeyedUnArchiver检索数据。 它将在写,如果你试图在同一文件路径写
您可以使用核心数据保存所有数据,并删除它时,你想要的。 上面的代码始终创建注释类的新对象,所以你必须每一次新的数据,但是当你将尝试用相同的名字写上“注意”。 它总是覆盖旧数据。
所有的,除了可以使用SQLite与应用程序在本地保存数据正确。
这只是一个文件,但接受所有标准的SQL语句。
这也是在本地保存的数据的一种方法..
对于通过节能NSUserDefaults的数据我使用GVUserDefaults
用法
创建于GVUserDefaults一个类别,在.h文件中添加一些性质,使他们在@dynamic .m文件。
// .h
@interface GVUserDefaults (Properties)
@property (nonatomic, weak) NSString *userName;
@property (nonatomic, weak) NSNumber *userId;
@property (nonatomic) NSInteger integerValue;
@property (nonatomic) BOOL boolValue;
@property (nonatomic) float floatValue;
@end
// .m
@implementation GVUserDefaults (Properties)
@dynamic userName;
@dynamic userId;
@dynamic integerValue;
@dynamic boolValue;
@dynamic floatValue;
@end
现在,而不是使用[[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]
,你可以简单地使用[GVUserDefaults standardUserDefaults].userName
。
你甚至可以通过设置属性保存默认设置:
[GVUserDefaults standardUserDefaults].userName = @"myusername";
你看,我给你的总体思路,您可以根据您的要求使用此代码。
1)获取的“路径” yourPlist.plist
文件:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourPlist.plist"];
2)将数据插入yourPlist:
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];
3)检索从yourPlist数据:
NSMutableArray *savedStock = [[NSMutableArray alloc] initWithContentsOfFile: path];
for (NSDictionary *dict in savedStock) {
NSLog(@"my Note : %@",dict);
}