如何将.sqlite3 / .sqlite文件导入ios应用程序?

时间:2013-10-22 19:29:04

标签: iphone ios objective-c sqlite

我有一个excel文件。

我已将该文件转换为.csv格式并将该文件导入base并将其转换为.sqlite文件。

所以问题是:

有没有办法将其导入ios应用程序并操纵数据。

有没有办法像核心数据一样使用它或将该文件导入核心数据。

请参考任何好的教程,最好是视频教程或其他好的教程。

3 个答案:

答案 0 :(得分:4)

您可以直接在FMDB库中使用它:https://github.com/ccgus/fmdb 另一种选择是将该文件导入核心数据,但这有点棘手。如果您按照以下步骤操作,则可以执行此操作:

  1. 在您的应用程序中创建空的SQLite数据库,并在模拟器中运行您的应用程序。
  2. 在您的计算机上打开模拟器目录并找到SQLite数据库文件。
  3. 使用SQLite命令行工具或“SQLite数据浏览器”GUI工具(http://sqlitebrowser.sourceforge.net/)查看内部。
  4. 将数据导入此数据库文件,而不更改核心数据元表中的结构和数据。
  5. 最后,您已准备好将SQLite数据库文件与核心数据一起使用。所以你把它放到你的应用包中。
  6. 在第一次启动应用程序时,您应该在配置核心数据堆栈之前将SQLite数据库文件复制到适当的目录(您知道应该将文件放在哪里 - 您已经在模拟器应用程序目录中找到它)。
  7. 听起来有点复杂,但确实有效;)

    关于为核心数据发送预先填充数据的好文章: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
}

Source article

另一种选择是使用最初在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,但我的文件可能有其他格式,所以这可能需要调整。您还可以查看使用任何读取文件内容的对象。例如;想到一种更简单的技术:

  1. NSString
  2. 上使用initWithContentsOfFile
  3. 为您提供内存中CSV的字符串
  4. 为每行迭代字符串
  5. 使用逗号循环播放该行并对每条数据执行某些操作
  6.   

    NSString * fileContents = [NSString stringWithContentsOfFile:@“myfile.txt”];    NSArray * lines = [fileContents componentsSeparatedByString:@“\ n”];   //循环并将行数组中的每一行拆分为有用的数据

    NSString

    假设你真的想在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,因为他们发布了涵盖这些主题的示例电影所有时间)。

    http://www.youtube.com/watch?v=bC3F8a4F_KE(见视频1:17)

答案 2 :(得分:0)

如果您有.sql文件,只需转到文件 - 添加文件即可将其导入项目。 另外,请记住,如果将.sql文件保留在捆绑包中,它将是只读的。 因此,除非您希望它是只读的,否则您应该创建新组并将.sql放在那里。