2016-04-02 38 views
0

我想預先填充我的數據庫。所以我從瀏覽器生成SQL查詢並編寫代碼將它們插入到數據庫中。它工作正常的單行查詢,但大多數插入查詢具有例如多行`Android中插入數據的Db文件中每個插入查詢都有多行

INSERT INTO `poem` VALUES (780,'سلام القلب واشواقه 

من قلب يحب مجنونه 

ياليت هالقلب يحن 


ويقول هالدنيا 

ماتسوى دون *_*','0',NULL);` 

我的要求是插入它們,因爲它們。這是我寫的多行的方法(可以完美單行查詢)

public static int countLines(InputStream is) throws IOException { 
    try { 
     byte[] c = new byte[1024]; 
     int count = 0; 
     int readChars = 0; 
     boolean empty = true; 
     int index = 0; 

     while ((readChars = is.read(c)) != -1) { 
      empty = false; 
      String temp = new String(c); 
      for (int i = 0; i < readChars; i++) { 

       if (c[i] == ';' && index == 0) { 
        index++; 
       } else if (c[i] == '\n' && index == 1) { 
        index++; 
       } else if (c[i] == '\t' && index == 2) { 
        index++; 
       } else if (c[i] == 'I' && index == 3) { 
        count++; 
        index = 0; 
       } else { 
        i -= index; 
        index = 0; 
       } 
      } 
     } 
     return (count == 0 && !empty) ? 1 : count + 1; 
    } finally { 
     is.close(); 
    } 
} 

任何人有任何想法如何插入從文件中這樣的查詢到DB? 任何幫助將是偉大的。謝謝

+0

有人嗎?幫幫我??? –

+0

爲什麼你不只是[用應用程序發運數據庫](http://stackoverflow.com/questions/513084/how-to-ship-an-android-application-with-a-database)? –

回答

0

對不起在具有同樣的問題

這裏任何人的情況下,反應遲緩是解決步步

我創建了一個.sql文件包含插入查詢(有些還包括多查詢)結尾。

在我的onCreate()方法SQLiteOpenHelper我用我的文件計數行使用getFileLineCount()。這種方法返回給我的行數。這行數從來沒有使用,但我有它,因爲如果你所有的查詢是單行,它可能會發揮作用。你可以跳過這個方法。

public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE \"" + TABLE_POEM + "\" (\"" + POEM_LOCAL_ID + "\" INTEGER PRIMARY KEY AUTOINCREMENT , \"" + POEM_TEXT + "\" TEXT,\"" + POEM_ID + "\" INTEGER , \"" + POEM_IS_FAV + "\" TEXT);"); 

      int totalLineCount = getFileLineCount("poem.sql"); 
      int insertCount = insertFromFile(db, "poem.sql", totalLineCount); 

      Log.d("DatabaseHelper", "------------onCreate(SQLiteDatabase db) >>>>>>> completed--------"); 
     } 
    private int getFileLineCount(String assetFilePath) { 
     InputStream insertStream = null; 
     int totalCount = 0; 
     try { 
      insertStream = context.getAssets().open(assetFilePath); 
      totalCount = FileUtil.countLines(new BufferedInputStream(insertStream)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (insertStream != null) { 
       try { 
        insertStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return totalCount; 
    } 

通過使用此方法,我從文件插入查詢。它可以處理單行查詢和多行查詢。首先我檢查一行是否包含";"這意味着該行結束,否則不會結束。最後很簡單。

while ((currentLine = insertReader.readLine()) != null) { 
          if (currentLine.length() != 0) { 
           if (currentLine.charAt(currentLine.length() - 1) == ';') { 
            insertInDb(db, insertStr + "\n" + currentLine); 
            insertStr = ""; 
           } else { 
            insertStr += currentLine; 
           } 
          } 
         } 




private int insertFromFile(SQLiteDatabase db, String assetFilePath, int totalCount) { 
      int result = 0; 
      BufferedReader insertReader = null; 
      try { 
       InputStream insertStream = context.getAssets().open(assetFilePath); 
       insertReader = new BufferedReader(new InputStreamReader(insertStream)); 

       db.beginTransaction(); 

       while (insertReader.ready()) { 

        // String insertStr = insertReader.toString(); 

        String insertStr = ""; 
        String currentLine; 
        while ((currentLine = insertReader.readLine()) != null) { 
         if (currentLine.length() != 0) { 
          if (currentLine.charAt(currentLine.length() - 1) == ';') { 
           insertInDb(db, insertStr + "\n" + currentLine); 
           insertStr = ""; 
          } else { 
           insertStr += currentLine; 
          } 
         } 
        } 

       } 
       db.setTransactionSuccessful(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if (insertReader != null) { 
        try { 
         insertReader.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       db.endTransaction(); 
      } 

      return result; 
     } 

     private void insertInDb(SQLiteDatabase db, String assetFilePath) throws IOException { 
      if (assetFilePath != null && assetFilePath.length() > 0) { 
       SQLiteStatement statement = db.compileStatement(assetFilePath); 
       statement.execute(); 

      } 

     } 

我用這種技術在db中插入4000條記錄。它工作得很好,沒有太多的滯後。如果有人有任何電池解決方案。請張貼它。

0

你在問什麼是一種醜陋的做事方式。使用sqliteassethelper來創建預先填充的數據庫和表。它的工作原理與SQLiteOpenHelper非常相似,因此它非常易於使用。

+0

不是很難看。但這是要求。客戶希望這樣。同時感謝你的幫助我解決了我的問題。 –

+0

如果您已經解決了問題,請在此處粘貼解決方案。它可能會幫助其他人 – suku

+0

即將發佈。 –