我正在构建一个与数据库通信的网络应用程序。我希望web-app从我的数据库下载所有信息,然后在本地保存,以便可以在本地访问和编辑(即使用户处于脱机状态),然后同步回我的数据库(当用户在线时)。
我的数据库中的每一行都包含2个字符串和3个整数,我的数据库中有大约1000-1500行(这可能会让您了解我的数据库的大小)。
那么哪种方式最好?是否有可能以某种方式在用户设备上缓存此类数据?比如通过JSON检索数据库,而不是将其本地存储在用户可以访问和处理的javascript数组中(如上所述:即使用户处于脱机状态,后面的部分也应该能够工作)。非常感谢所有输入。我至少在这里思考正确的方向吗?
编辑:我只是想澄清一下我正在使用网络应用程序。一个开发了HTML,CSS和Javascript的应用程序。我没有做一个原生的目标C iOS应用程序。答案 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。除了持久性之外,您还可以获得我和其他人概述的许多其他好处,例如here和here。如上所述,您可以使用SQLite作为应用程序的后备存储,然后您可以根据需要访问条目的对象表示。如果您正在处理同步,您可能还需要查看iCloud,您可以找到有关here的信息。
答案 3 :(得分:0)
如果您使用网络技术开发移动应用程序,则特别存储数据的最佳方法是使用SQLite。您可以在离线或在线模式下存储,检索数据。另一个优点是,如果您决定使用本机,您可以将数据库移植到任何移动设备或桌面应用程序。
如果您有更多问题或需要帮助,请与我联系,我可以为您提供有关如何将SQLite与网络技术结合使用的更多信息?
如果您希望节省为移动应用设计Web GUI的时间,可以使用移动Web框架,这可以加快开发时间并允许您访问设备上的某些本机API。我推荐Sencha:http://www.sencha.com/products/touch/(基于Html5,JS,CSS3的非常好的框架)