将单独的 .sqlite 文件添加到 ios 项目
Posted
技术标签:
【中文标题】将单独的 .sqlite 文件添加到 ios 项目【英文标题】:add Separate .sqlite file to ios project 【发布时间】:2013-11-25 07:05:20 【问题描述】:我已经从 SQLite Manager firefox 插件创建了一个 myDB.sqlite 数据库。我想将此 myDB.sqlite 文件添加到我的项目中。然后我可以编写函数来从表中获取数据。
我尝试将 myDB.sqlite 文件添加到项目文件夹并创建一个像这样的文件路径。但我认为这个文件路径是错误的。
-(NSString *) filePath
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"document.sqlite"];
return path;
将 myDB.sqlite 文件添加到项目文件夹是否正确?或者我应该在哪里保存这个 myDB.sqlite 文件以及我应该使用什么文件路径?
【问题讨论】:
当您发布问题的解决方案时学习accept answer。 【参考方案1】:在您的项目中添加您的 myDB.sqlite 文件。通过右键单击您的项目名称 => 将文件添加到“项目名称”,然后添加它。
要获取你的文件路径,你可以在你的 appDelegate 中添加它
- (void) copyDatabaseIfNeeded
//Using NSFileManager we can perform many file system operations.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSString *dbPath = [self getDBPath];
BOOL success = [fileManager fileExistsAtPath:dbPath];
if(!success)
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.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
//Search for standard documents using NSSearchPathForDirectoriesInDomains
//First Param = Searching the documents directory
//Second Param = Searching the Users directory and not the System
//Expand any tildes and identify home directories.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
//NSLog(@"dbpath : %@",documentsDir);
return [documentsDir stringByAppendingPathComponent:@"myDB.sqlite"];
在您确实完成了启动方法调用 [self copyDatabaseIfNeeded];
【讨论】:
当我把这个 myDB.sqlite 文件保存在模拟器文件夹中时。但这是一个空文件(没有我的表格) 重置模拟器,然后尝试从模拟器复制sqlite数据库。 然后出现错误“NSInternalInconsistencyException”,原因:“无法创建可写数据库文件,并显示消息“操作无法完成。(Cocoa 错误 260。)”。 " 查看这个答案***.com/questions/10378564/… 终于把它弄对了....感谢您的帮助..抱歉我不能投票,因为我只有 14 个声望。【参考方案2】:我假设您已成功将 sqlite db 复制到项目的文件夹中。所以你现在在你的应用程序包中有 sqlite 数据库。
因此,您需要使用以下代码将数据库从应用程序包复制到设备/模拟器的文档目录。将这些写在 AppDelegate.m 中
- (void) copyDatabaseIfNeeded
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSString *folderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
// First, test for existence.
if (![fileManager fileExistsAtPath:folderPath])
[fileManager createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:&error]; //Create folder
NSString *dbPath = [folderPath stringByAppendingPathComponent:@"document.sqlite"];
BOOL success = [fileManager fileExistsAtPath:dbPath];
if(!success)
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"document.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if (!success)
NSAssert1(0, @"document.sqlite : Failed to create writable database file with message '%@'.", [error localizedDescription]);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
/** Database copy is not exist **/
[self copyDatabaseIfNeeded];
// Override point for customization after application launch.
return YES;
【讨论】:
当我把这个 document.sqlite 文件保存在模拟器文件夹中时。但这是一个空文件(没有我的表格)【参考方案3】:-(void)addSqlFileIfNotExists
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"document.sqlite"];
BOOL exits = [fileManager fileExistsAtPath:writableDBPath];
if(exits) return;
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"document.sqlite"];
BOOL exit = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!exit)
NSLog(@"%@",[error localizedDescription]);
【讨论】:
以上是关于将单独的 .sqlite 文件添加到 ios 项目的主要内容,如果未能解决你的问题,请参考以下文章
应用轻量级迁移后,将 ios-add 列添加到 sqlite?
如何将 SQLite (SQLite.NET) 添加到我的 C# 项目中
如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1