2012-04-03 10 views
1

Ich baue eine Web-App, die mit einer Datenbank kommuniziert. Ich möchte, dass die Web-App alle Informationen aus meiner Datenbank herunterlädt und sie dann lokal speichert, so dass auf sie zugegriffen werden kann (auch wenn der Benutzer offline ist) und dann zurück zu meiner Datenbank synchronisiert wird (wenn der Benutzer online ist).Speichern von Daten mit lokalem Speicher auf einem iPhone - welchen Weg zu gehen?

Jede Zeile in meiner Datenbank besteht aus 2 Strings und 3 Integers und ich habe ungefähr 1000-1500 Zeilen in meiner Datenbank (das könnte Ihnen eine Vorstellung über die Größe meiner db geben).

Also was ist der beste Weg zu gehen? Ist es möglich, diese Art von Daten auf dem Benutzergerät irgendwie zu cachen? Wie die Datenbank über JSON abrufen und lokal in einem Javascript-Array speichern, auf das der Benutzer zugreifen und an dem er arbeiten kann (wie erwähnt: der spätere Teil sollte funktionieren können, selbst wenn der Benutzer offline ist). Alle diesbezüglichen Informationen werden sehr geschätzt. Denke ich hier wenigstens in die richtige Richtung?

EDIT: Ich möchte nur klarstellen, dass ich mit einer Web-App arbeite. Eine App mit HTML, CSS und Javascript entwickelt. Ich mache keine native objektive C iOS App.

+1

In SQLite suchen. Das Framework ist in XCode enthalten. libsqlite3.0.dylib – PaulG

+0

Beachten Sie unbedingt die neuen [Datenspeicherrichtlinien] (https://developer.apple.com/icloud/documentation/data-storage/). Du wirst ziemlich hart geschlagen, wenn du es nicht tust. –

+0

Leute, ich möchte nur klarstellen, dass ich mit einer Web-App arbeite. Eine App mit HTML, CSS und Javascript entwickelt. Ich mache keine native objektive C iOS App. – nalas

Antwort

0

Die beste Möglichkeit, die Daten speziell zu speichern, wenn Sie Webtechnologien zur Entwicklung Ihrer mobilen App verwenden, ist die Verwendung von SQLite. Sie können Ihre Daten im Offline- oder Online-Modus speichern und abrufen. Ein weiterer Vorteil ist, dass Sie Ihre Datenbank auf ein beliebiges mobiles Gerät oder eine Desktop-App portieren können, wenn Sie sich dafür entschieden haben, nativ zu werden.

Wenn Sie weitere Fragen haben oder Hilfe benötigen, kontaktieren Sie mich und ich kann Ihnen weitere Informationen zur Verwendung von SQLite mit Webtechnologien geben.

Wenn Sie beim Entwerfen einer Web-GUI für Ihre mobile App Zeit sparen möchten, können Sie das mobile Webframework verwenden. Dies beschleunigt die Entwicklungszeit und ermöglicht den Zugriff auf einige native APIs auf dem Gerät. Ich empfehle Sencha: http://www.sencha.com/products/touch/ (Wirklich schöne Framework-Basis auf Html5, JS, CSS3)

0

Sie sollten Core Data verwenden (die SQLite verwendet).

+0

Das stimmt nicht ganz. Core Data verwendet SQLite als Hintergrundspeicher, wenn Sie dies definieren. Es gibt eine Reihe anderer Geschäfte, die Sie mit Core Data verwenden können. Es ist nicht so, als wenn man keinen Speicher definiert, man erhält SQLite standardmäßig. Dies muss explizit festgelegt werden. – jmstone617

0

Sie müssen in Persistenz suchen, und die beste Option dafür ist Core Data. Abgesehen von Ausdauer, erhalten Sie eine Menge anderer großer Vorteile, die ich und andere beispielsweise here und here skizziert haben. Wie bereits erwähnt, können Sie SQLite als Backing Store für die App verwenden und dann auf die Objektdarstellungen der Einträge zugreifen, wie Sie möchten. Wenn Sie mit der Synchronisierung zu tun haben, können Sie auch in iCloud nachsehen, wo Sie Informationen über here finden.

+0

Ich möchte nur klarstellen, dass ich mit einer Web-App arbeite, die mit HTML, CSS und Javascript entwickelt wurde. Ich mache keine native objektive C iOS App. Sprechen Sie nicht darüber? – nalas

+0

Ja, das ging davon aus, dass Sie eine App mit nativen Komponenten erstellten. – jmstone617

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]; 
Verwandte Themen