execSQL不会从Asset运行SQL语句

时间:2012-04-27 21:39:25

标签: android sqlite

public void execSqlFromAssets(String path) {
    InputStream input;
    String text;
    try {
        input = mCtx.getAssets().open(path + ".txt");
        int size = input.available();
        byte[] buffer = new byte[size];
        input.read(buffer);
        input.close();
        text = new String(buffer);
        String[] inserts = text.split(";");
        // SQLiteDatabase db = mDb;
        for (String insert : inserts) {
            insert = insert;
            Log.w(TAG, insert);
            try {
                mDb.execSQL(insert);
            } catch (Exception e) {
                String err = (e.getMessage() == null) ? "Cant execute sql"
                        + insert : e.getMessage();
                Log.w(TAG, err);
            }
        }

    } catch (IOException e) {
        Log.w(TAG, "execSqlFromAssets: " + path + " file not found");
    }

}

这是我的代码问题在线,包含 mDb.execSQL(插入)。它抛出异常,我无法读取值为null。我只是没有得到它的错误消息之一是: 无法执行sqlINSERT INTO food(name,cals)VALUES(“kolac”,270)。 任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

好的,因为@Preet Sangha要求我发布解决方案。 我的问题是我在onCreate方法中的SQLiteOpenHelper实例中调用了这个函数 mDb实例尚未创建,因此我将功能更改为此

public void execSqlFromAssets(String path, SQLiteDatabase db) {
    if(db == null){
        db = mDb;
    }
    InputStream input;
    String text;
    try {
        input = mCtx.getAssets().open(path + ".txt");
        int size = input.available();
        byte[] buffer = new byte[size];
        input.read(buffer);
        input.close();
        text = new String(buffer);
        String[] inserts = text.split(";");
        for (String insert : inserts) {
            try {
                db.execSQL(insert);
            } catch (Exception e) {
                String err = (e.getMessage() == null) ? "Cant execute sql"
                        + insert : e.getMessage();
                Log.w(TAG, err);
            }
        }

    } catch (IOException e) {
        Log.w(TAG, "execSqlFromAssets: " + path + " file not found");
    }

}

所以现在如果我从onCreate调用此函数,我将发送db作为第二个参数,如果我从应用程序的其他组件调用它,我将发送null作为第二个参数