SQLiteException无法插入行

时间:2011-01-21 21:07:55

标签: android database sqlite

插入sqlite3数据库失败的可能原因是什么?来自SQLiteException的跟踪不是特别有用。

有没有办法获得有关导致异常的更好信息?

创建表格时(抱歉任何不稳定的间距):

http://pastebin.com/QqUgdDz0

在SAX解析器的endElement中解析值:

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;

堆栈跟踪:

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)

我应该注意,这里的URI中的NULL是一个字符串值,并且根据URI匹配方案是可接受的。这是一次测试运行,尚未使用实际值。

更新: 事实证明,我的合作伙伴(谁正在制作XML)遗漏了一些项目。一切都弄清楚了。

感谢您的帮助!我很感激时间。

3 个答案:

答案 0 :(得分:3)

一些:

  1. SQLite db
  2. 使用的存储空间不足
  3. 无权使用sdcard并使用sdcard支持的数据库
  4. 请求在数据库的只读副本上插入行
  5. 可能会有更多。

答案 1 :(得分:2)

我遇到了类似的问题,在我的情况下,插入是在删除整个表之后完成的。

信不信由你,返回的rowId实际上是0,所以行WAS已插入,但内容提供者的代码认为不是。

从SQliteDatabase的文档中:插入

  

新插入行的行ID,如果发生错误,则返回-1

验证rowId的代码> 0(这是Android示例BTW上使用的那个)不正确

应该是:

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;
}

答案 2 :(得分:0)

也许您正在尝试插入违反“PRIMARY KEY”或“UNIQUE”限制的行(但是,我看到您的数据库中没有任何“UNIQUE”字段)?