导入如果iOS sqlite中不存在数据库

时间:2014-05-28 03:46:52

标签: ios sqlite

我的问题是,每当渲染我的应用程序时,始终从资源文件导入sqlite数据库(它已经有如此多的设置数据)。我第一次渲染我的应用程序,它从资源文件导入sqlite数据库,我将一些数据插入表中。但第二次再次渲染,它再次导入并丢失了我插入的记录。以下是我的编码。

如果数据库存在,我想要它不需要导入。

static NaWinDatabase *_database;

+ (NaWinDatabase*)database {
    if (_database == nil) {
        _database = [[NaWinDatabase alloc] init];
    }
    return _database;
}

- (id)init {
    if ((self = [super init])) {
        NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"nawin" ofType:@"sqlite3"];

        if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
            NSLog(@"Failed to open database!");
        }
    }
    return self;
}

5 个答案:

答案 0 :(得分:1)

copyDatabaseIfNeeded会将资源数据库复制到应用程序目录文件夹(如果第一次没有复制)

+ (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:@"db.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:@"db.sqlite"];
    }

答案 1 :(得分:0)

只需检查应用程序启动时SQLite DB是否存在,如果不存在则导入它,如果确实存在则不导入。 SQLite DB只是一个文件。

答案 2 :(得分:0)

无论文件是否存在,

sqlite3的sqlite3_open都会成功。

我假设您的数据库是从SQL创建的。如果是这样,并且您想查看数据库是否已设置,则可以对数据库连接执行pragma schema_version;查询。如果它返回0,则表示还没有表。任何其他值,您已创建表。

确保您的表创建和记录插入是原子的,您应该没有进一步的麻烦。

答案 3 :(得分:0)

我最近没在iOS上使用sqlite,但我记得必须在文档目录中打开数据库。我相信出于安全原因,主捆绑无法修改。基本上你的数据库是只读的。

我做的事情如下:

    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *dbPath = [docsPath stringByAppendingPathComponent:name];
    fmdb = [FMDatabase databaseWithPath:dbPath];
    [fmdb open];

答案 4 :(得分:0)

尝试这可能会有所帮助......它工作正常

    - (void)copyDatabaseIfNeeded {
    // First, test for existence.
       BOOL success;
       NSFileManager *fileManager      =   [NSFileManager defaultManager];
       NSError *error;
    NSArray *paths                  =   NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory    =   [paths objectAtIndex:0];
    writableDBPath                  =   [documentsDirectory stringByAppendingPathComponent:@"carDatabase.sqlite"];

    success                         =   [fileManager fileExistsAtPath:writableDBPath];
    if (success)
        return;
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath         =   [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"carDatabase.sqlite"];
    success                         =   [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    NSLog(@"Result For Database path %c",success);
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
    NSLog(@"Result For Database path %c",success);
}

//Get DataBase Path
- (NSString *) getDBPath {
    NSString *sqLiteDb = writableDBPath ; // [[NSBundle mainBundle] pathForResource:@"liveonmap_iphone" ofType:@"sqlite"];

    return sqLiteDb;
}

干杯......