使用iPhone上的本地存储保存数据 - 哪种方式?

时间:2012-04-03 21:03:31

标签: iphone arrays json caching local

我正在构建一个与数据库通信的网络应用程序。我希望web-app从我的数据库下载所有信息,然后在本地保存,以便可以在本地访问和编辑(即使用户处于脱机状态),然后同步回我的数据库(当用户在线时)。

我的数据库中的每一行都包含2个字符串和3个整数,我的数据库中有大约1000-1500行(这可能会让您了解我的数据库的大小)。

那么哪种方式最好?是否有可能以某种方式在用户设备上缓存此类数据?比如通过JSON检索数据库,而不是将其本地存储在用户可以访问和处理的javascript数组中(如上所述:即使用户处于脱机状态,后面的部分也应该能够工作)。非常感谢所有输入。我至少在这里思考正确的方向吗?

编辑:我只是想澄清一下我正在使用网络应用程序。一个开发了HTML,CSS和Javascript的应用程序。我没有做一个原生的目标C iOS应用程序。

4 个答案:

答案 0 :(得分:2)

make a class of NSObject

@interface abc : NSObject<NSCoding>

@property..... // add properties that you want to save 

-(void)initWithDictionary:(NSMutableDictionary *)dictionary; // override init by passing dictionary with values of your properties

@end

in abc.m file 

implement these functions

-(void)initWithDictionary:(NSMutableDictionary *)dictionary
{

    yourProperty=[dictionary valueForKey:@"propertyKey"];

}

-(void) encodeWithCoder:(NSCoder *)aCoder{

    [aCoder encodeObject:yourProperty forKey:@"propertyKey"];

}

-(id) initWithCoder:(NSCoder *)aDecoder{

    self =[super init];

    if(self){

        [self setyourProperty:[aDecoder decodeObjectForKey:@"yourProperty"]];

    }
    return self;
}


now make a shared class that can be accessed from anywhere

@interface xyz : NSObject
{
    NSMutableArray *allItems;
}

+(xyz *) sharedStore;

-(NSMutableArray *)allItems;

-(abc *) createItem:(NSMutableDictionary *)dictionary;

-(NSString *) saveItemPath;

-(BOOL)saveChanges;


now in xyz.m implement these functions

-(id)init{

    self=[super init];

    if(self){

        NSString *path=[self saveItemPath];

        allItems=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

        if(!allItems){

            allItems=[[NSMutableArray alloc]init] ;//]WithObjects:@"No more item in store", nil];

        }

    }

    return self;
}
+(xyz *)sharedStore{

    static xyz *sharedStore=nil;

    if(!sharedStore){

        sharedStore=[[super allocWithZone:nil]init];

    }

    return sharedStore;

}
+(id)allocWithZone:(NSZone *)zone{

    return [self sharedStore];

}
-(NSArray *)allItems{

    //[allItems insertObject:@"No more items are in store" atIndex:[allItems count]];
    return allItems;

}

-(abc *) createItem:(NSMutableDictionary *)dictionary
{
    abc *p=[[abc alloc] init];
    [p initWithDictionary:dictionary];
    [allItems insertObject:p atIndex:0];
    return p;
}

-(NSString *) saveItemPath
{
    NSArray *documentdirectories=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

    NSString * documentDirectory=[documentdirectories objectAtIndex:0];

    return [documentDirectory stringByAppendingPathComponent:@"items.archive"];

}

-(BOOL) saveChanges
{

    NSString *path=[self saveItemPath];

    return [NSKeyedArchiver archiveRootObject:allItems toFile:path];

}


now you can use the global variable like this

[xyz sharedStore]allItems]

now do one more thing, add this line to application did enter background

[xyz sharedStore]saveChanges];

答案 1 :(得分:0)

您应该使用Core Data(使用SQLite)。

答案 2 :(得分:0)

您需要研究持久性,最佳选择是Core Data。除了持久性之外,您还可以获得我和其他人概述的许多其他好处,例如herehere。如上所述,您可以使用SQLite作为应用程序的后备存储,然后您可以根据需要访问条目的对象表示。如果您正在处理同步,您可能还需要查看iCloud,您可以找到有关here的信息。

答案 3 :(得分:0)

如果您使用网络技术开发移动应用程序,则特别存储数据的最佳方法是使用SQLite。您可以在离线或在线模式下存储,检索数据。另一个优点是,如果您决定使用本机,您可以将数据库移植到任何移动设备或桌面应用程序。

如果您有更多问题或需要帮助,请与我联系,我可以为您提供有关如何将SQLite与网络技术结合使用的更多信息?

如果您希望节省为移动应用设计Web GUI的时间,可以使用移动Web框架,这可以加快开发时间并允许您访问设备上的某些本机API。我推荐Sencha:http://www.sencha.com/products/touch/(基于Html5,JS,CSS3的非常好的框架)