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

如果iOS sqlite中不存在数据库,则导入,ios,sqlite,Ios,Sqlite,我的问题是,每当渲染我的应用程序时,它总是从资源文件导入sqlite数据库(它已经有很多设置数据)。我第一次呈现我的应用程序时,它从资源文件导入sqlite数据库,并向表中插入一些数据。但第二次再次渲染时,它再次导入并丢失了插入的记录。下面是我的代码 如果数据库存在,则不需要导入我想要的内容 static NaWinDatabase *_database; + (NaWinDatabase*)database { if (_database == nil) { _dat

我的问题是,每当渲染我的应用程序时,它总是从资源文件导入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;
}

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

sqlite3的
sqlite3\u open
无论文件是否存在都会成功

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


确保您的表创建和记录插入是原子的,您应该不会再有任何问题。

我最近没有在iOS上使用sqlite,但我记得必须在文档目录中打开数据库。我认为出于安全原因,无法修改主捆绑包。实际上,您的数据库是只读的

我会这样做:

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

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

试试这可能是帮助充分。。。很好用

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

干杯

你能给我举个例子吗?你能给我举个例子说明编码吗?或者纠正我现有的编码方式,比如这样的,但是模式版本而不是用户版本: