iphoneにsqliteを統合する

私は私のアプリケーションでデータベースを作成している、Dbを作成した後、私はアプリのバンドルからDocディレクトリにコピーしています。私はそれをコピーすることができませんでした、私は次のようなエラーが表示されます 操作を完了できませんでした。 (ココアのエラー260) 以下は、私が使っているコードです。この問題を解決するのを手伝ってください。

dbName="userDetails.db";
returnCode=sqlite3_open(dbName,&handler);
if(returnCode!=SQLITE_OK)
    NSLog(@"message---%s",sqlite3_errmsg(handler));
else
    NSLog(@"sucess---%d",returnCode);

NSFileManager *fmgr=[NSFileManager defaultManager];
NSError *error;
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path=[paths objectAtIndex:0];
NSString *docPath=[path stringByAppendingPathComponent:@"userDetails.db"];
if(![fmgr fileExistsAtPath:docPath]){
    NSString *defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"userDetails.db"];
    if(![fmgr copyItemAtPath:defaultDBPath toPath:docPath error:&error])
        NSLog(@"failure message----%@",[error localizedDescription]);
}
1

5 答え

以下のコードを試してみてください。

 - (void) copyDatabaseIfNeeded {

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbPath = [self getDBPath];
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xyz.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 {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"XYZ.sqlite"];
}

- (BOOL)アプリケーション:(UIApplication *)アプリケーションdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions のappDelegateメソッドに - (void)CopyDatabaseIfNeeded を追加します。

1
追加された

実際に私はあなたのコードと少し混乱しています。プログラムバンドルでデータベースをプログラムで作成し、それをドキュメントディレクトリにコピーしようとしていますか?これがあなたがやっていることであれば、あなたはアプリケーションバンドルで何かを作成したり変更したりすることができないことを知る必要があります。このデータベースをDocumentsディレクトリに作成する必要があります。あなたはこのような何かをするべきです -

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    NSString * databasePath = [documentsDir stringByAppendingPathComponent:@"XYZ.sqlite"];

   //generate databasePath programmatically
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    {

       //your  code here
    }

しかし、あなたがすでにアプリケーションにデータベースを持っていて(動的に作成していない)、それをドキュメントディレクトリにコピーしたいのであれば、@ Santosh Gurramの答えに従ってください。

1
追加された

コアデータの使用を検討し、最初のペイロードにJSONシリアライズファイルを使用しますか?

0
追加された

2つのことが思い浮かぶ。

  1. Trying logging the path names (docPath and defaultDBPath). Are they correct?
  2. You have opened the db file, maybe it is not letting you copy due to this. Try commenting the following lines:

    returnCode=sqlite3_open(dbName,&handler);

    if(returnCode!=SQLITE_OK)

    NSLog(@"message---%s",sqlite3_errmsg(handler));
    

    else

    NSLog(@"sucess---%d",returnCode);
    
0
追加された

こんにちは私はdb.sqliteをプロジェクトバンドルに追加したときにプロジェクトに追加オプションをチェックするのを忘れてしまったので同じ問題がありました。これをチェックして :)

0
追加された