我目前正在使用此代码复制我的SQLite数据库,但是目前只检查该文件是否存在...我想更改它以检查文件是否完全相同,例如我我担心如果数据库损坏或没有完全复制,应用程序将失去功能,解决此问题的唯一方法是删除应用程序并重新下载。
那么我如何比较两个文件是否完全相同?
- (void) copyDatabaseIfNeeded {
//Using NSFileManager we can perform many file system operations.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSString *dbPath = [self getDBPath];
BOOL success = [fileManager fileExistsAtPath:dbPath];
//NSLog(@"%d",success);
if(!success) {
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database01.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if (!success)
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
}
- (NSString *) getDBPath
{
//Search for standard documents using NSSearchPathForDirectoriesInDomains
//First Param = Searching the documents directory
//Second Param = Searching the Users directory and not the System
//Expand any tildes and identify home directories.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
//NSLog(@"dbpath : %@",documentsDir);
return [documentsDir stringByAppendingPathComponent:@"database01.sqlite"];
}
答案 0 :(得分:4)
您可以使用contentsEqualAtPath:andPath:
NSFileManager
方法来实现此目的。
使用这样的代码:
......
if(!success) {
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database01.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if (!success)
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
success = [fileManager contentsEqualAtPath:defaultDBPath andPath:dbPath]; //verify if file size and content matches
if(!success) {
//report error
}
}
.......
它应该为你做到这一点。
答案 1 :(得分:1)
编辑 - 忘记这个答案 - 使用Ayan的那个。
首先比较文件大小。如果大小不同,您就知道文件不一样。这是一个简单快速的检查。
如果大小相同,则需要逐个字节地比较文件。一种效率低下的方法是将两个文件加载到NSData
个对象中,看它们是否相等。这仅在文件总是足够小以适合内存时才有效。
更好的方法是将两个文件作为流打开并以块的形式读取它们。比较每个块(比如每个2k),直到两个块不同或者你到达终点。