Iphone SQLite未正确导入到iOS中
似乎当我将.sqlite3文件复制到iOS中,并使用Iphone SQLite未正确导入到iOS中,iphone,objective-c,sqlite,fmdb,Iphone,Objective C,Sqlite,Fmdb,似乎当我将.sqlite3文件复制到iOS中,并使用FMDB访问它时,数据库是空的。我只是将它拖放到Xcode中。当我跑步时: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [docu
FMDB
访问它时,数据库是空的。我只是将它拖放到Xcode中。当我跑步时:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite3"];
FMDatabase *db = [FMDatabase databaseWithPath:writableDBPath];
FMResultSet *results = [db executeQuery:@"SELECT * FROM tableName"];
结果
返回零。查看[db lastErrorMessage]
,它表示我的表不存在。当我在命令行中打开.sqlite文件(存储在iPhone模拟器中的文件)时,我得到一个空数据库。是否有将SQLite数据库导入iOS的特定方法?如果是,如何解决?我发现两个可能的问题:
首先,确保.sqlite文件包含在项目目标中。在文件导航器中选择您的文件;打开实用程序面板(显示“视图”部分的右侧面板图标),然后查找标题为“目标成员资格”的部分。如果未选中所需目标(可能只有一个)的框,则不会将数据库文件复制到捆绑包中
其次,您正在尝试在文档目录中查找数据库。但是,您必须手动将其从捆绑包复制到该目录,然后才能将其作为可写文件打开:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite3"];
NSURL *dbURL = [NSURL fileURLWithPath:dbPath];
// copy a database from the bundle if not present
// on disk
NSFileManager *fm = [NSFileManager defaultManager];
if (![fm fileExistsAtPath:dbPath]) {
NSURL *bundlePath = [[NSBundle mainBundle] URLForResource:@"db" withExtension:@"sqlite3"];
NSError *error = nil;
if (!bundlePath || ![fm copyItemAtURL:bundlePath toURL:dbURL error:&error]) {
NSLog(@"error copying database from bundle: %@", error);
}
}
我想你也可以把你原来的代码。你只需要打开“db”
谢谢<代码>[self-applicationDocumentsDirectory]找不到。我将其替换为我问题中的前三行。然后我使用了NSString
dbPath
作为路径,我仍然遇到同样的问题。你知道为什么吗?我在上面的三行中替换了你的方法,对吗?如果documents目录中没有DB,那么这段代码只会从捆绑包中复制DB,因此请确保你正在运行新的安装-从你的设备或模拟器中删除应用程序的旧副本。我认为这里发生的部分事情是,-databaseWithPath:
正在创建一个新的数据库,如果找不到它,就会产生一个空的存储数据库。
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = [paths objectAtIndex:0];
//NSString * documentDirectory = @"/Users/cefitdept/Documents/ImportDB/";
NSString * dbPath = [documentDirectory stringByAppendingPathComponent:@"ImportDB.sqlite"];
FMDatabase * db = [FMDatabase databaseWithPath:dbPath];
if (![db open]) {
return;
}
FMResultSet * results = [db executeQuery:@"SELECT * FROM main"];
while ([results next]) {
NSData * data = [results dataForColumn:@"engs"];
NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}