2011-01-21 15 views
1

sqlite3データベースへの挿入に失敗した理由は何ですか? SQLiteExceptionからのトレースは特に役に立ちません。SQLiteExceptionが行の挿入に失敗しました

例外の原因についてより良い情報を得る方法はありますか?表は、(任意グラグラ間隔のために申し訳ありません)が作成され

http://pastebin.com/iN1M8QMe

インサート:値は、SAXパーサをするendElementに解析され

http://pastebin.com/QqUgdDz0

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を作成していた人)がいくつかの項目を残していることが判明しました。すべてが分かった。

ありがとうございました!私は時間を感謝します。

+0

あなたはそれを私たちに見せてもらえますか?そして挿入の周りのコード? –

+0

stacktrace?また、{}ボタンを使用して質問内でコードスニペットの書式を設定することもできます。これは外部リンクよりも好ましい方法です。 –

+0

ContentProvider(JobProvider?!)の "insert()"関数からコードスニペットを提供してください。 – dbm

答えて

3

数:

ストレージ内のスペースのうち
  1. は、SDカードを使用してSQLiteのDB
  2. 権限なしで使用されているとの要求SDカード担保デシベル
  3. を使用すると、読み取り専用のコピーに行を挿入しますデータベースの

さらに多くの可能性があります。

0

"PRIMARY KEY"または "UNIQUE"の制限に違反する行を挿入しようとしている可能性があります(ただし、データベースに「ユニーク」フィールドがないことがわかります)。

+1

「insert()」スニペットをありがとう!あなたは "validValues" ContentValuesについて何か言っていただけますか?私が完全に間違っていないなら、私はあなたのテーブルに "プライマリキー"のidフィールドがあると思います。 ContentValues( "validValuse")にid列のデータが含まれていますか?既に存在するIDを挿入しようとしている可能性があります。 – dbm

2

私も同様の問題がありました。私の場合、挿入はテーブル全体を削除した直後に行われました。

実際には返されたrowIdは0なので、行は挿入されましたが、コンテンツプロバイダーのコードはそうではないと考えました。SQliteDatabaseのドキュメントから

新しく挿入された行の行IDを挿入する、または-1エラーが

を一つ行ID> 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

あなたの答えは私の問題を解決しました。 – afazolo

関連する問題