Команда "INSERT" с sqlEscapeString() вызывает исключение NullPointerException

Я использую функцию sqlEscapeString(String param) для экранирования специальных символов в строках, которые я вставляю в базу данных моего приложения для Android. Я делаю это с несколькими наборами данных, но один конкретный набор продолжает доставлять мне неприятности. Строки, которые я пытаюсь сохранить, взяты из строк JSON, проанализированных с помощью библиотеки Gson. Пример строки типа, который я читаю здесь, может быть:

{"group":"Adult 5","classes":[{"title":"Coed 1","teachers":"Hollis / Maxwell","callnum":"551","room":"B-213"},{"title":"Coed 2","teachers":"Thweatt","callnum":"552","room":"B-202"},{"title":"Coed 3","teachers":"Davis","callnum":"553","room":"E-102"}]}

Журнал:

01-19 20:40:49.197: E/AndroidRuntime(1429): FATAL EXCEPTION: AsyncTask #1
01-19 20:40:49.197: E/AndroidRuntime(1429): java.lang.RuntimeException: An error occured while executing doInBackground()
01-19 20:40:49.197: E/AndroidRuntime(1429):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.lang.Thread.run(Thread.java:1096)
01-19 20:40:49.197: E/AndroidRuntime(1429): Caused by: java.lang.NullPointerException
01-19 20:40:49.197: E/AndroidRuntime(1429):     at android.database.DatabaseUtils.appendEscapedSQLString(DatabaseUtils.java:216)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at android.database.DatabaseUtils.sqlEscapeString(DatabaseUtils.java:236)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.Updater.sant(Updater.java:104)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.Updater.sundaySchool(Updater.java:321)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.Updater.dataTypeExecutor(Updater.java:79)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.Updater.updateAll(Updater.java:62)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.UpdaterTask.doInBackground(UpdaterTask.java:12)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at com.lakesidebaptist.lakesidelife.update.UpdaterTask.doInBackground(UpdaterTask.java:1)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-19 20:40:49.197: E/AndroidRuntime(1429):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 20:40:49.197: E/AndroidRuntime(1429):     ... 4 more

Воскресная школа():

private static void sundaySchool() {
        List<SundaySchoolGroups> ssgList = Fetcher.sundaySchool();
        Iterator<SundaySchoolGroups> ssgIt = ssgList.iterator();

        dba.query("DROP TABLE IF EXISTS 'sunday_school';");
        dba.query("CREATE TABLE 'sunday_school' ('id' integer primary key autoincrement,"
                + "'group' text, 'title' text, 'teachers' text, 'room' text);");

        while (ssgIt.hasNext()) {
            SundaySchoolGroups ssg = ssgIt.next();
            List<SundaySchoolClasses> sscList = ssg.classes;
            Iterator<SundaySchoolClasses> sscIt = sscList.iterator();

            while (sscIt.hasNext()) {
                SundaySchoolClasses ssc = sscIt.next();
                String ssQuery = "INSERT INTO 'sunday_school' ('group', 'title', 'teachers', 'room')"
                        + " VALUES ("
                        + sant(ssg.group)
                        + ", "
                        + sant(ssc.title)
                        + ", "
                        + sant(ssc.teachers)
                        + ", " + sant(ssc.room) + ")";
                dba.query(ssQuery);
            }
        }

        updateStatus[DataType.SUNDAY_SCHOOL.ordinal()] = true;
    }

сант ():

/**
 * This method acts as an alias for the sqlEscapeString(str) method in
 * DatabaseUtils.
 * 
 * @param str
 * @return
 */
private static String sant(String str) {
    return DatabaseUtils.sqlEscapeString(str);
}

Заранее спасибо за любую помощь с этим!

1 ответ

Решение

Кажется, что проблема была в том, что я отправлял запрос с моим методом query (команда String), который был псевдонимом, который я создал для метода execSQL(). По-видимому, я не должен использовать этот метод для большинства операций SQL, а использовать rawQuery().

Другие вопросы по тегам