我的问题是,每当渲染我的应用程序时,始终从资源文件导入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;
}
答案 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;
}
干杯......