Интеграция sqlite в iphone - PullRequest
       12

Интеграция sqlite в iphone

1 голос
/ 25 ноября 2011

Я создаю базу данных в своем приложении, после создания БД я пытаюсь скопировать БД из комплекта приложения в каталог документов. Но я не могу скопировать ее, я получаю сообщение об ошибке вроде Операция не может быть завершена. (Ошибка какао 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]);
}

Ответы [ 5 ]

1 голос
/ 25 ноября 2011

На самом деле я немного запутался с вашим кодом.Вы пытаетесь программно создать базу данных в комплекте приложений и затем скопировать ее в каталог документов?Если это то, что вы делаете, вам нужно знать, что вы не можете создавать или изменять что-либо в комплекте приложений.Вы должны создать эту базу данных в каталоге документов.Вы должны сделать что-то вроде этого -

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 голос
/ 25 ноября 2011

Попробуйте следующий код,

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

Добавьте метод -(void)CopyDatabaseIfNeeded in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions appDelegate.

0 голосов
/ 30 октября 2012

Привет, у меня была такая же проблема, потому что, когда я добавил db.sqlite в комплект проекта, я забыл проверить опцию добавления в проект.Проверьте это:)

0 голосов
/ 25 ноября 2011

Рассмотрите возможность использования Core Data, а затем используйте сериализованный файл JSON для начальной загрузки?

0 голосов
/ 25 ноября 2011

На ум приходят две вещи:

  1. Попытка записи имен путей (docPath и defaultDBPath).Они правильные?
  2. Вы открыли файл базы данных, возможно, он не позволяет вам копировать из-за этого.Попробуйте прокомментировать следующие строки:

    returnCode = sqlite3_open (dbName, & handler);

    if (returnCode! = SQLITE_OK)

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

    else

    NSLog(@"sucess---%d",returnCode);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...