Android在文件的Db中插入数据,每个Insert查询都有多行

时间:2016-04-02 13:34:30

标签: java android sqlite android-assets

我想预先填充我的数据库。所以我从浏览器生成SQL查询并编写代码将它们插入到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();
    }
}

任何人都知道如何将这些查询从文件插入到数据库中。 任何帮助都会很棒。感谢

2 个答案:

答案 0 :(得分:0)

你所要求的是一种丑陋的做事方式。使用sqliteassethelper创建预填充的数据库和表。它与SQLiteOpenHelper非常相似,因此非常易于使用。

答案 1 :(得分: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条记录。它没有太大的滞后,工作正常。如果有人有任何击球手解决方案。请发布它。