使用现有SQLite的iOS核心数据?

时间:2012-03-21 11:12:22

标签: iphone objective-c sql ios

我想在iOS核心数据中创建一个新表,我之前使用过以下xml文件在java中创建,并希望在可能的情况下重新使用

sql.xml文件

<sql>
<statement>
CREATE TABLE IF NOT EXISTS place (
        _id INTEGER PRIMARY KEY AUTOINCREMENT, 
        Name VARCHAR(50), 
    Location VARCHAR(50),
    Description VARCHAR(300),  
    Type VARCHAR(50),
    longitude DOUBLE(50),
    latitude DOUBLE(50),
</statement>

 <statement>INSERT INTO place VALUES(1,'Clare'
     ,'Co Clare'
     ,'Clare Description'
     ,'County'
     ,'52.924014'
         ,'-9.353399')
 </statement>
 <statement>INSERT INTO surfSpot VALUES(2,'etc...

Java代码

 public void onCreate(SQLiteDatabase db){
      String s;
      try{
        InputStream in = context.getResources().openRawResource(R.raw.sql);
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(in, null);
        NodeList statements = doc.getElementsByTagName("statement");
        for (int i=0; i<statements.getLength(); i++) {
            s = statements.item(i).getChildNodes().item(0).getNodeValue();
            db.execSQL(s);
        }
    } catch (Throwable t) {

    }
}

数据库是静态的,我想建议如何为iOS做同样的事情,一步一步的说明将是理想的答案

2 个答案:

答案 0 :(得分:2)

这不是核心数据的工作方式,我担心。它使用SQLite是一个实现细节。事实上,它甚至没有 来使用SQLite;还有其他持久性商店类型。

可以直接插入Core Data创建的SQLite数据库中。我强烈建议不要这样做。它会非常脆弱,并且在主要版本更新时可能会失败。

更好的解决方案可能是直接使用SQLite,完全忽略核心数据。核心数据是大多数应用程序的一个很好的抽象,但不是唯一的方法,并不是所有用例的最佳方式。

答案 1 :(得分:0)

您必须首先认识到核心数据数据库引擎;它是一个对象图持久性框架。其持久性商店类型之一恰好是sqlite商店。因此,在数据库世界中可识别的“表”之类的术语不能转移到核心数据,至少在您在应用程序中使用的抽象级别。

您可以使用现有的XML导出来填充Core Data持久性存储;但是要意识到sqlite后备存储格式是不透明的 - 你必须在模拟器的文件系统上找到它,然后编写一个代码块,将现有的XML导出桥接到Core Data的sqlite持久存储。这将比它的价值更麻烦。