2012-01-20 8 views
3

Documentsディレクトリにコピーした後、元のファイルが137KBで、サイズが0 KBになった.dbファイルに問題があります。 SQLite Managerでコピーしたファイルを開こうとしました。それは開く、ファイルの破損について苦情しない...それはただ1つのテーブルが含まれていません。sqliteファイルをDocumentsフォルダにコピーした後、ファイルが空になった

私のコードは、ファイルをコピーします

- (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]; 
} 

それは私には奇妙です。助けてください?前もって感謝します。

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は、ドキュメントディレクトリにアクセスするための有効な方法だとは思わない....

が、この場合は確かに知ってはいけない:あなたはこれでそれを試すについてどのように

答えて

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) 

私は別々の方法をすべて呼び出します。それは助けになった。

1

それを解決しますが、試してみる価値があります。

+0

いいえ、役に立たないです。私はまだ空のdbを得ています – NCFUSN

+0

あなたはそれがクリーンなコピーだと確信していますか?私のアプリは何とかデータベースをキャッシュしていました。たとえ私がアプリをきれいにしたとしても、私は手動でアプリディレクトリを削除して、再度インストールする必要がありました... – Ron

+0

私はそれを行いました。私はiphoneシミュレータで削除しようとしましたが、それらは手動で別の試行の後に削除されました。何も役に立たない。新しい新鮮なコンパイルのたびに、さらに0KBのデータベースが生まれます。 – NCFUSN

7

結局のところ、 私はこれが好きでした。それは私のために働いた。

1).dbファイルをクリックします。

2)その後、右側にfileInspectorを見つけ、ファイルインスペクタ

3)チェックボックスがチェックされているかどうかの.dbファイルのターゲット・メンバーシップを確認する]をクリックします。

4)

は、このことができます場合、私は知りませんが、あなたはコアデータ「.sqlite」データベースをコピーする場合、それはまた、それをコピーし

+0

ありがとう、あなたは私を救った –

+0

しかし、どうしてこれが本当に起こるのだろうか? .sqlite3ファイルは、必要なライブラリフォルダにコピーされていますが、DBスキーマは不要です。そして、ここの理由は、それが目標メンバーシップを持たなかったためであると思われます。しかし、それが目標メンバーシップを持っていなかった場合、どのようにそれが与えられた経路にコピーされるのでしょうか? 手掛かりがあれば教えてください! ありがとう!あなたは多くの時間を節約! (Y) –

0

...それが動作するホープチェックボックスをチェックしない場合空ですが、さらに2つのファイル '.sqlite-shm'と '.sqlite-wal'があります。 それぞれの拡張子を持つ同じ名前の2つのファイルをさらにコピーすると、データベースは空ではなくなります。

関連する問題