我有一个excel文件。
我已将该文件转换为.csv格式并将该文件导入base并将其转换为.sqlite文件。
所以问题是:
有没有办法将其导入ios应用程序并操纵数据。
有没有办法像核心数据一样使用它或将该文件导入核心数据。
请参考任何好的教程,最好是视频教程或其他好的教程。
答案 0 :(得分:4)
您可以直接在FMDB库中使用它:https://github.com/ccgus/fmdb 另一种选择是将该文件导入核心数据,但这有点棘手。如果您按照以下步骤操作,则可以执行此操作:
听起来有点复杂,但确实有效;)
关于为核心数据发送预先填充数据的好文章:http://www.objc.io/issue-4/importing-large-data-sets-into-core-data.html
答案 1 :(得分:3)
<强>更新强>
请注意更新后的回复。
有没有办法将它(SQLite)导入ios应用程序并操纵数据?
您可以将sqlite文件导入Xcode,只需使用“添加新文件”将其作为资源添加...但是,与Core Data一起使用它的能力有限(除非它是使用Core Data创建的)。可以查看之前引用的objc.io article,其中介绍了如何处理Xcode项目中的预填充数据。以下是该文章的相关部分。
NSFileManager* fileManager = [NSFileManager defaultManager];
NSError *error;
if([fileManager fileExistsAtPath:self.storeURL.path]) {
NSURL *storeDirectory = [self.storeURL URLByDeletingLastPathComponent];
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:storeDirectory
includingPropertiesForKeys:nil
options:0
errorHandler:NULL];
NSString *storeName = [self.storeURL.lastPathComponent stringByDeletingPathExtension];
for (NSURL *url in enumerator) {
if (![url.lastPathComponent hasPrefix:storeName]) continue;
[fileManager removeItemAtURL:url error:&error];
}
// handle error
}
NSString* bundleDbPath = [[NSBundle mainBundle] pathForResource:@"seed" ofType:@"sqlite"];
[fileManager copyItemAtPath:bundleDbPath toPath:self.storeURL.path error:&error];
NSDictionary *infoDictionary = [NSBundle mainBundle].infoDictionary;
NSString* bundleVersion = [infoDictionary objectForKey:(NSString *)kCFBundleVersionKey];
NSString *seedVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"SeedVersion"];
if (![seedVersion isEqualToString:bundleVersion]) {
// Copy the seed database
}
// ... after the import succeeded
[[NSUserDefaults standardUserDefaults] setObject:bundleVersion forKey:@"SeedVersion"];
假设有人想要导入CSV文件而不是Excel或SQLite ... 由于这是一个常见问题,这里有一个简单的解析器,可以用来将CSV数据合并到Xcode中项目。
func parseCSV (contentsOfURL: NSURL, encoding: NSStringEncoding, error: NSErrorPointer) -> [(name:String, detail:String, price: String)]? {
// Load the CSV file and parse it
let delimiter = ","
var items:[(name:String, detail:String, price: String)]?
if let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error) {
items = []
let lines:[String] = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]
for line in lines {
var values:[String] = []
if line != "" {
// For a line with double quotes
// we use NSScanner to perform the parsing
if line.rangeOfString("\"") != nil {
var textToScan:String = line
var value:NSString?
var textScanner:NSScanner = NSScanner(string: textToScan)
while textScanner.string != "" {
if (textScanner.string as NSString).substringToIndex(1) == "\"" {
textScanner.scanLocation += 1
textScanner.scanUpToString("\"", intoString: &value)
textScanner.scanLocation += 1
} else {
textScanner.scanUpToString(delimiter, intoString: &value)
}
// Store the value into the values array
values.append(value as! String)
// Retrieve the unscanned remainder of the string
if textScanner.scanLocation < count(textScanner.string) {
textToScan = (textScanner.string as NSString).substringFromIndex(textScanner.scanLocation + 1)
} else {
textToScan = ""
}
textScanner = NSScanner(string: textToScan)
}
// For a line without double quotes, we can simply separate the string
// by using the delimiter (e.g. comma)
} else {
values = line.componentsSeparatedByString(delimiter)
}
// Put the values into the tuple and add it to the items array
let item = (name: values[0], detail: values[1], price: values[2])
items?.append(item)
}
}
}
return items
}
另一种选择是使用最初在Ray W. list of tools中提到的核心数据编辑器工具。此GUI editor尝试更轻松地处理CSV数据导入。
有没有办法像核心数据一样使用它或将该文件导入核心数据?
因此,SQLite数据库与Core Data(这是一个对象图持久性......)不同。我本来打算进入我的dia骂,但Apple的Core Data FAQ说它比我更好......:
如何将现有的SQLite数据库与Core Data一起使用?
你没有。虽然Core Data支持SQLite作为其持久性之一 商店类型,数据库格式是私有的。你不能创建一个 SQLite数据库使用原生SQLite API并直接与Core一起使用 数据(也不应该操纵现有的Core Data SQLite存储 使用原生SQLite API)。如果您有现有的SQLite数据库,那么 需要将其导入Core Data存储(请参阅高效导入 数据)。
这是官方的答案。提供的任何其他东西只是一种解决事实的方法,即不应该这样做。
但是,鉴于您还有一个CSV文件,您还有其他一些选择。在过去,我已经构建了一个文件阅读器,使用流阅读器检查CSV文件的内容。这是gist,但我的文件可能有其他格式,所以这可能需要调整。您还可以查看使用任何读取文件内容的对象。例如;想到一种更简单的技术:
NSString * fileContents = [NSString stringWithContentsOfFile:@“myfile.txt”]; NSArray * lines = [fileContents componentsSeparatedByString:@“\ n”]; //循环并将行数组中的每一行拆分为有用的数据
假设你真的想在iOS中使用SQLite,尽管有警告......你可以将sqlite3库添加到你的项目中。有关如何使用SQLite而不是Core Data的完整详细信息。其中一个在线教程是AppCoda
涵盖了基础知识(sample project):
保存...
- (IBAction)saveInfo:(id)sender {
// Prepare the query string.
NSString *query = [NSString stringWithFormat:@"insert into peopleInfo values(null, '%@', '%@', %d)", self.txtFirstname.text, self.txtLastname.text, [self.txtAge.text intValue]];
// Execute the query.
[self.dbManager executeQuery:query];
// If the query was successfully executed then pop the view controller.
if (self.dbManager.affectedRows != 0) {
NSLog(@"Query was executed successfully. Affected rows = %d", self.dbManager.affectedRows);
// Pop the view controller.
[self.navigationController popViewControllerAnimated:YES];
}
else{
NSLog(@"Could not execute the query.");
}
}
...编辑
-(void)loadInfoToEdit{
// Create the query.
NSString *query = [NSString stringWithFormat:@"select * from peopleInfo where peopleInfoID=%d", self.recordIDToEdit];
// Load the relevant data.
NSArray *results = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]];
// Set the loaded data to the textfields.
self.txtFirstname.text = [[results objectAtIndex:0] objectAtIndex:[self.dbManager.arrColumnNames indexOfObject:@"firstname"]];
self.txtLastname.text = [[results objectAtIndex:0] objectAtIndex:[self.dbManager.arrColumnNames indexOfObject:@"lastname"]];
self.txtAge.text = [[results objectAtIndex:0] objectAtIndex:[self.dbManager.arrColumnNames indexOfObject:@"age"]];
}
...删除
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the selected record.
// Find the record ID.
int recordIDToDelete = [[[self.arrPeopleInfo objectAtIndex:indexPath.row] objectAtIndex:0] intValue];
// Prepare the query.
NSString *query = [NSString stringWithFormat:@"delete from peopleInfo where peopleInfoID=%d", recordIDToDelete];
// Execute the query.
[self.dbManager executeQuery:query];
// Reload the table view.
[self loadData];
}
}
Re:请参考任何好的教程,最好是视频教程或一些 其他好的。
以下教程应满足您的需求。关于这个主题有很多教程,您可以访问www.lynda.com,详细了解如何使用SQLite构建iOS应用程序(完全访问涉及一些成本,但搜索Youtube,因为他们发布了涵盖这些主题的示例电影所有时间)。
答案 2 :(得分:0)
如果您有.sql文件,只需转到文件 - 添加文件即可将其导入项目。 另外,请记住,如果将.sql文件保留在捆绑包中,它将是只读的。 因此,除非您希望它是只读的,否则您应该创建新组并将.sql放在那里。