SQLiteException не удалось вставить строку - PullRequest
1 голос
/ 22 января 2011

Каковы возможные причины неудачной вставки в базу данных sqlite3? Трассировка от SQLiteException не особенно полезна.

Есть ли способ получить лучшую информацию о том, что вызвало исключение?

Где создается таблица (извините за шаткий интервал):

http://pastebin.com/QqUgdDz0

Где значения анализируются в endElement парсера SAX:

http://pastebin.com/iN1M8QMe

Где вставка называется:

http://pastebin.com/xUqrmexw

Вставить регистр в провайдера:

case SUBMATERIAL_SINGLE_URI:
            rowId = db.insert(jobName+JobMetaData.SubmaterialTableMetaData.TABLE_NAME_SUFFIX,
                              JobMetaData.SubmaterialTableMetaData.TYPE, validValues);
            if (rowId > 0)
            {
                Uri submaterialUri = ContentUris.withAppendedId(JobMetaData.SubmaterialTableMetaData.CONTENT_URI,
                        rowId);
                getContext().getContentResolver().notifyChange(submaterialUri, null);
                return submaterialUri;
            }
            break;

StackTrace:

System.err( 8048): android.database.SQLException: Failed to insert row into content://dsndata.sds2mobile.jobprovider/C_1/submaterial/NULL
System.err( 8048):  at dsndata.sds2mobile.JobProvider.insert(JobProvider.java:341)
System.err( 8048):  at android.content.ContentProvider$Transport.insert(ContentProvider.java:180)
System.err( 8048):  at android.content.ContentResolver.insert(ContentResolver.java:587)
System.err( 8048):  at dsndata.sds2mobile.parser.MobileParser.endElement(MobileParser.java:227)
System.err( 8048):  at org.xml.sax.helpers.XMLReaderAdapter.endElement(XMLReaderAdapter.java:355)
System.err( 8048):  at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:160)
System.err( 8048):  at org.apache.harmony.xml.ExpatParser.append(Native Method)
System.err( 8048):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505)
System.err( 8048):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492)
System.err( 8048):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308)
System.err( 8048):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264)
System.err( 8048):  at org.xml.sax.helpers.XMLReaderAdapter.parse(XMLReaderAdapter.java:225)
System.err( 8048):  at javax.xml.parsers.SAXParser.parse(SAXParser.java:361)
System.err( 8048):  at dsndata.sds2mobile.parser.MobileParser.parse(MobileParser.java:120)
System.err( 8048):  at dsndata.sds2mobile.UI.onClick(UI.java:90)
System.err( 8048):  at android.view.View.performClick(View.java:2408)
System.err( 8048):  at android.view.View$PerformClick.run(View.java:8817)
System.err( 8048):  at android.os.Handler.handleCallback(Handler.java:587)
System.err( 8048):  at android.os.Handler.dispatchMessage(Handler.java:92)
System.err( 8048):  at android.os.Looper.loop(Looper.java:144)
System.err( 8048):  at android.app.ActivityThread.main(ActivityThread.java:4937)
System.err( 8048):  at java.lang.reflect.Method.invokeNative(Native Method)
System.err( 8048):  at java.lang.reflect.Method.invoke(Method.java:521)
System.err( 8048):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
System.err( 8048):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
System.err( 8048):  at dalvik.system.NativeStart.main(Native Method)

Я должен отметить, что NULL в URI здесь является строковым значением и является приемлемым согласно схеме сопоставления URI. Это тестовый запуск и пока не используются реальные значения.

Обновление: Оказывается, мой партнер (который создавал XML) пропустил несколько пунктов. Понял все это.

Спасибо за вашу помощь! Я ценю время.

Ответы [ 3 ]

3 голосов
/ 22 января 2011

Несколько:

  1. Недостаточно места в хранилище, используемом SQLite db
  2. Нет разрешения на использование sdcard и использование db

Там может быть еще много.

2 голосов
/ 13 июля 2013

У меня возникла похожая проблема, в моем случае вставка была сделана сразу после удаления всей таблицы.

Хотите верьте, хотите нет, но возвращенный rowId был на самом деле 0, поэтому строка была БЫЛА вставлена, но код поставщика контента решил, что это не так.*

идентификатор строки новой вставленной строки или -1, если произошла ошибка

Код проверки rowId> 0 (который используется в примерах Android, кстати, равенневерно

должно быть:

if (rowId < 0) {
   throw new SQLException(FAILED_TO_INSERT_ROW_ERROR + uri);
}
else {
    Uri returnUri = ContentUris.withAppendedId(Table.getContentUri(), rowId);
    getContext().getContentResolver().notifyChange(returnUri, null);
    return returnUri;
}
0 голосов
/ 22 января 2011

Может быть, вы пытаетесь вставить строку, которая нарушает ограничение "PRIMARY KEY" или "UNIQUE" (хотя я вижу, что в вашей базе данных нет полей "UNIQUE")?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...