如果iOS sqlite中不存在数据库,则导入
我的问题是,每当渲染我的应用程序时,它总是从资源文件导入sqlite数据库(它已经有很多设置数据)。我第一次呈现我的应用程序时,它从资源文件导入sqlite数据库,并向表中插入一些数据。但第二次再次渲染时,它再次导入并丢失了插入的记录。下面是我的代码 如果数据库存在,则不需要导入我想要的内容如果iOS sqlite中不存在数据库,则导入,ios,sqlite,Ios,Sqlite,我的问题是,每当渲染我的应用程序时,它总是从资源文件导入sqlite数据库(它已经有很多设置数据)。我第一次呈现我的应用程序时,它从资源文件导入sqlite数据库,并向表中插入一些数据。但第二次再次渲染时,它再次导入并丢失了插入的记录。下面是我的代码 如果数据库存在,则不需要导入我想要的内容 static NaWinDatabase *_database; + (NaWinDatabase*)database { if (_database == nil) { _dat
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;
}
干杯 你能给我举个例子吗?你能给我举个例子说明编码吗?或者纠正我现有的编码方式,比如这样的,但是模式版本而不是用户版本: