我对Xcode和sqlite有点新鲜。现在我有一个名为“mydb.db”的数据库文件,它已经有了一些表和数据。我把它放在我的mac文件夹中,然后将它拖到我的Xcode项目“Supporting Files”下。
这是我的代码,但我发现我只能读取这个“mydb.db”,并且无法向其中插入数据!当我在sqlite manager执行我的代码后打开“mydb.db”时,我不能 找到应该插入的数据!
谁能告诉我如何解决这个问题?非常感谢!
NSString *dbFilePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"db"];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbFilePath]
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO Focus VALUES (?,?,?)" withArgumentsInArray:@[@"100000000",@2,@2]];
}];
答案 0 :(得分:2)
通过将sqlite db文件添加到Xcode中的Supporting Files组,您只需将该文件添加到应用程序的bundle中,以便在构建过程中将其与所有其他资源打包在一起。由于应用程序无法写入到其捆绑包,因此必须将捆绑包中的sqlite数据库文件复制到可写位置,例如
#define FORCE_RECOPY_DB NO
- (void)copyDatabaseIfNeeded {
NSFileManager *fm = [[NSFileManager alloc] init];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *destinationPath = [documentsPath stringByAppendingPathComponent:@"pte.sqlite"];
void (^copyDb)(void) = ^(void){
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"pte" ofType:@"sqlite"];
NSAssert1(sourcePath, @"source db does not exist at path %@",sourcePath);
NSError *copyError = nil;
if( ![fm copyItemAtPath:sourcePath toPath:destinationPath error:©Error] ) {
DDLogError(@"ERROR | db could not be copied: %@", copyError);
}
};
if( FORCE_RECOPY_DB && [fm fileExistsAtPath:destinationPath] ) {
[fm removeItemAtPath:destinationPath error:NULL];
copyDb();
}
else if( ![fm fileExistsAtPath:destinationPath] ) {
DDLogInfo(@"INFO | db file needs copying");
copyDb();
}
}
现在,当您想要打开数据库时,请使用文档路径中的位置。
请注意,您将无法检查项目中的sqlite db文件,并希望找到从代码中编写的更改。 (因为您的代码现在将使用复制的sqlite文件。)
答案 1 :(得分:1)
首先学习IOS的教程。
非常简单。
const char *sqlStatement = "insert into Userprofile (Userauth, Age, , Year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
然后使用sqlite3_prepare_v2语句执行该sqlStatement。