Sqlite database synchronization with iCloud

I have a sqlite database. now i want to sync with icloud. I read blogs saying sqlite sync with icloud is not supported. Either send the kernel data, or "Do exactly what the kernel data does."

Now it’s not suitable for the main data. Since the second option is "Do something similar to how CoreData synchronizes sqlite DB: send" transaction logs "to iCloud and create each local sqlite file."

please, can anyone share any sample code for sqlite "transaction log" OR can calculate step by step in detail, what should I do?

+8
ios5
source share
1 answer

1) I followed this link to create xml. You can download the corresponding api from your github.Link - http://arashpayan.com/blog/2009/01/14/apxml-nsxmldocument-substitute-for-iphoneipod-touch/

2) when the button is pressed:

-(IBAction) btniCloudPressed:(id)sender { // create the document with it's root element APDocument *doc = [[APDocument alloc] initWithRootElement:[APElement elementWithName:@"Properties"]]; APElement *rootElement = [doc rootElement]; // retrieves same element we created the line above NSMutableArray *addrList = [[NSMutableArray alloc] init]; NSString *select_query; const char *select_stmt; sqlite3_stmt *compiled_stmt; if (sqlite3_open([[app getDBPath] UTF8String], &dbconn) == SQLITE_OK) { select_query = [NSString stringWithFormat:@"SELECT * FROM Properties"]; select_stmt = [select_query UTF8String]; if(sqlite3_prepare_v2(dbconn, select_stmt, -1, &compiled_stmt, NULL) == SQLITE_OK) { while(sqlite3_step(compiled_stmt) == SQLITE_ROW) { NSString *addr = [NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,0)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,1)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,2)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,3)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,4)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,5)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,6)]]; addr = [NSString stringWithFormat:@"%@#%@",addr,[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,7)]]; //NSLog(@"%@",addr); [addrList addObject:addr]; } sqlite3_finalize(compiled_stmt); } else { NSLog(@"Error while creating detail view statement. '%s'", sqlite3_errmsg(dbconn)); } } for(int i =0 ; i < [addrList count]; i++) { NSArray *addr = [[NSArray alloc] initWithArray:[[addrList objectAtIndex:i] componentsSeparatedByString:@"#"]]; APElement *property = [APElement elementWithName:@"Property"]; [property addAttributeNamed:@"id" withValue:[addr objectAtIndex:0]]; [property addAttributeNamed:@"street" withValue:[addr objectAtIndex:1]]; [property addAttributeNamed:@"city" withValue:[addr objectAtIndex:2]]; [property addAttributeNamed:@"state" withValue:[addr objectAtIndex:3]]; [property addAttributeNamed:@"zip" withValue:[addr objectAtIndex:4]]; [property addAttributeNamed:@"status" withValue:[addr objectAtIndex:5]]; [property addAttributeNamed:@"lastupdated" withValue:[addr objectAtIndex:6]]; [property addAttributeNamed:@"deleted" withValue:[addr objectAtIndex:7]]; [rootElement addChild:property]; [property release]; APElement *fullscore = [APElement elementWithName:@"FullScoreReport"]; [property addChild:fullscore]; [fullscore release]; select_query = [NSString stringWithFormat:@"SELECT AnsNo,Answer,AnswerScore,MaxScore,AnsIndex FROM FullScoreReport WHERE Addr_ID = %@",[addr objectAtIndex:0]]; select_stmt = [select_query UTF8String]; if(sqlite3_prepare_v2(dbconn, select_stmt, -1, &compiled_stmt, NULL) == SQLITE_OK) { while(sqlite3_step(compiled_stmt) == SQLITE_ROW) { APElement *answer = [APElement elementWithName:@"Answer"]; [answer addAttributeNamed:@"AnsNo" withValue:[NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,0)]]]; [answer addAttributeNamed:@"Answer" withValue:[NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,1)]]]; [answer addAttributeNamed:@"AnswerScore" withValue:[NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,2)]]]; [answer addAttributeNamed:@"MaxScore" withValue:[NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,3)]]]; [answer addAttributeNamed:@"AnsIndex" withValue:[NSString stringWithFormat:@"%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiled_stmt,4)]]]; [fullscore addChild:answer]; [answer release]; } sqlite3_finalize(compiled_stmt); } } sqlite3_close(dbconn); NSString *prettyXML = [doc prettyXML]; NSLog(@"\n\n%@",prettyXML); //***** PARSE XML FILE ***** NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Properties.xml" ]; NSData *file = [NSData dataWithBytes:[prettyXML UTF8String] length:strlen([prettyXML UTF8String])]; [file writeToFile:path atomically:YES]; NSString *fileName = [NSString stringWithFormat:@"Properties.xml"]; NSURL *ubiq = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier:nil]; NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:fileName]; MyDocument *mydoc = [[MyDocument alloc] initWithFileURL:ubiquitousPackage]; mydoc.xmlContent = prettyXML; [mydoc saveToURL:[mydoc fileURL]forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { if (success) { NSLog(@"XML: Synced with icloud"); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"iCloud Syncing" message:@"Successfully synced with iCloud." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; } else NSLog(@"XML: Syncing FAILED with icloud"); }]; } 

3) File MyDocument.h

 #import <UIKit/UIKit.h> @interface MyDocument : UIDocument @property (strong) NSString *xmlContent; @end 

4) File MyDocument.m

 #import "MyDocument.h" @implementation MyDocument @synthesize xmlContent,zipDataContent; // Called whenever the application reads data from the file system - (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError { // NSLog(@"* ---> typename: %@",typeName); self.xmlContent = [[NSString alloc] initWithBytes:[contents bytes] length:[contents length] encoding:NSUTF8StringEncoding]; [[NSNotificationCenter defaultCenter] postNotificationName:@"noteModified" object:self]; return YES; } // Called whenever the application (auto)saves the content of a note - (id)contentsForType:(NSString *)typeName error:(NSError **)outError { return [NSData dataWithBytes:[self.xmlContent UTF8String] length:[self.xmlContent length]]; } @end 

5) now in ur appdelegate

 - (void)loadData:(NSMetadataQuery *)queryData { for (NSMetadataItem *item in [queryData results]) { NSString *filename = [item valueForAttribute:NSMetadataItemDisplayNameKey]; NSNumber *filesize = [item valueForAttribute:NSMetadataItemFSSizeKey]; NSDate *updated = [item valueForAttribute:NSMetadataItemFSContentChangeDateKey]; NSLog(@"%@ (%@ bytes, updated %@) ", filename, filesize, updated); NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; MyDocument *doc = [[MyDocument alloc] initWithFileURL:url]; if([filename isEqualToString:@"Properties"]) { [doc openWithCompletionHandler:^(BOOL success) { if (success) { NSLog(@"XML: Success to open from iCloud"); NSData *file = [NSData dataWithContentsOfURL:url]; //NSString *xmlFile = [[NSString alloc] initWithData:file encoding:NSASCIIStringEncoding]; //NSLog(@"%@",xmlFile); NSXMLParser *parser = [[NSXMLParser alloc] initWithData:file]; [parser setDelegate:self]; [parser parse]; //We hold here until the parser finishes execution [parser release]; } else { NSLog(@"XML: failed to open from iCloud"); } }]; } } } 

6) now in the parser method, data is extracted and inserted / updated as necessary in the database.

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)nameSpaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqual:@"Property"]) { NSLog(@"Property attributes : %@|%@|%@|%@|%@|%@|%@|%@", [attributeDict objectForKey:@"id"],[attributeDict objectForKey:@"street"], [attributeDict objectForKey:@"city"], [attributeDict objectForKey:@"state"],[attributeDict objectForKey:@"zip"],[attributeDict objectForKey:@"status"],[attributeDict objectForKey:@"lastupdated"],[attributeDict objectForKey:@"deleted"]); } //like this way fetch all data and insert in db } 
+18
source share

All Articles