使用SQLiteOpenHelper从SQL

时间:2016-07-27 18:16:51

标签: android android-sqlite sqliteopenhelper

当我尝试通过将相关的SQL语句复制到包含String必须运行的SQL语句的SQLiteOpenHelper变量来插入我的数据的短部分时,一切正常。这是我的疑问:

String POPULATE_TABLE =
            "INSERT INTO `en_sahih` (`indexID`, `chapterNo`, `verseNo`, `verseText`) VALUES\n" +
            "(1, 1, 1, 'This is verse 1'),\n" +
            "(2, 1, 2, 'This is verse 2'),\n" +
            "(3, 1, 3, 'This is verse 3'),\n" +
            "(4, 1, 4, 'This is verse 4'),\n" +
            "(5, 1, 5, 'This is verse 5'),\n" +
            "(6, 1, 6, 'This is verse 6'),\n" +
            "(7, 1, 7, 'This is verse 7');";
    db.execSQL(POPULATE_TABLE);

但是当我将整个6k记录复制到字符串中时,这可能不是理想的解决方法,Android工作室告诉我String太长了。如何以SQL语句的形式轻松获取已有的数据并将其放入.sql文件中,并在我已在我的应用程序中设置的新数据库中执行它们。有关如何做到这一点的任何建议吗?

2 个答案:

答案 0 :(得分:2)

  1. 将记录保存在文本文件中(通过用crlf分隔每条记录)

     // records.txt
     1, 1, 1, 'This is verse 1'
     2, 1, 2, 'This is verse 2'
    
  2. 然后你可以使用一些Reader实现(例如BufferedReader)

    从文件中读取记录
    file -> file input stream -> reader 
    

    How can I read a text file in Android?

     // create the file class object pointing to text file 
     File file = new File(some_path,"records.txt");
    
     // initialize reader class object providing file object
     BufferedReader br = new BufferedReader(new FileReader(file));
    
  3. 使用while循环处理数据 - > Reader.readline()方法

     while ((line = Reader.readLine()) != null) {
    
         // a/ do insert 
         // b/ store data in some prim array 
         //    or via some list implementation (`ArrayList<String>`) 
         // then use insert or bulk
    
     }
    
  4.   

    我喜欢这个答案的全面性@ ceph3us非常感谢。但是,有两件事: 1。使用这种方法进行6k插入可能会减慢速度,我该如何处理?和 2。由于我将使用此文件的多个副本(不同语言)进行插入,因此拥有文本文件以及数据库本身将创建冗余并使我的应用占用的空间增加一倍在设备上。完成插入后,是否可以以编程方式删除文本文件

    1. 首先请求阅读:

      插入6k记录可能需要几秒 :)

      请参阅https://www.sqlite.org/faq.html#q19

    2. 第二次使用

       File.delete();
      

      RandomAccessFile.setLength(0);
      
    3. 来自作者:

      您的应用程序是否使用网络通信?

      如果 - 请考虑使用某些网络托管帐户或vps作为应用数据的外部来源 - 那么分布式尺寸将会很小。 - 您还可以保持数据不过时(在服务器端进行某种更新 - 在您的案例记录中插入 - 您减少了在客户端进行应用程序更新的需要) - 基本移动到服务器/客户端应用程序

答案 1 :(得分:0)

您最好的选择是使用XML或类似CSV的东西。您可以轻松地放置表中的所有数据,使用适当的标记进行排列,然后访问以检索数据并插入到其他数据库中。如果您不确定XML是什么样的:

<parent attribute="something">
    <child attribute="something">
        <!-- More tags or data here //-->
    </child>
</parent>

如果您不确定如何实现这一目标,建议您查看this页面,其中有关于将数据库导出到XML文件的问题。看你怎么走。