将sqlite文件复制到Documents文件夹后,文件变空

时间:2012-01-20 00:45:11

标签: ios cocoa-touch sqlite

我的.db文件有问题,复制到Documents目录后获得0 KB的大小,而原始文件是137KB。我试图在SQLite Manager中打开我复制的文件。它打开,不抱怨文件损坏......它只是不包含一个表。

我复制文件的代码:

- (void) createEditableDatabase
{
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error;
    NSString *writableDB = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"yc_ch.db"];
    success = [fileManager fileExistsAtPath:writableDB];
    if (success)
    {
        return;
    }
    NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    error = nil;
    success = [fileManager copyItemAtPath:defaultPath toPath:writableDB error:&error];
    if (!success) 
    {
        NSAssert1(0, @"Failed to create writable database file:%@", [error localizedDescription]);
    }
}

检查文件是否存在,如果不是副本。检查发生在RootViewController的

- (void)viewDidLoad
{
    self.subCountriesArr=[[NSMutableArray alloc]initWithCapacity:1];
    NSMutableArray *subCountriesTemp=[[[NSMutableArray alloc]init]autorelease];

    DBAccess *dbAccess=[[DBAccess alloc]init];
    [dbAccess createEditableDatabase]; //method to copy file
    subCountriesTemp=[dbAccess getSubCountries];

    [dbAccess closeDataBase];
    [dbAccess release];
}

所以,这对我来说很奇怪。有什么帮助吗?提前谢谢。

4 个答案:

答案 0 :(得分:7)

毕竟, 我确实喜欢这个。它对我有用。

1)点击.db文件。

2)然后在右侧找到fileInspector,单击文件检查器

3)检查.db文件的目标成员资格是否选中复选框。

4)如果没有勾选复选框

希望它会起作用......

答案 1 :(得分:1)

你怎么试试这个:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDB = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:writableDB] ) {
    NSString *databaseFile = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    [fileManager copyItemAtPath:databaseFile toPath:writableDB error:nil];
    NSLog(@"database copied");
}

我不认为NSHomeDirectory是访问文档目录的有效方式....

不确定这是否会解决问题,但值得一试。

答案 2 :(得分:0)

好吧,我已经解决了这个问题。在我的DBAccess类中,我有方法:

-(void)initializeDataBase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

   // NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
    {
        //
    }
    else
    {
        [self dbConnectionError];
    }
}

它在init中被调用。 - (void)初始化了initializeDataBase。现在,这段代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"];

NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)

我分别打电话给每个方法。它有所帮助。

答案 3 :(得分:0)

我不知道这是否有帮助,但如果您复制核心数据' .sqlite'数据库它也将它复制为空,但还有两个文件' .sqlite-shm'和' .sqlite-wal'。 如果您使用相应的扩展名复制另外两个具有相同目的地名称的文件,则数据库不再为空。