2011-01-21 6 views
1

sqlite3 데이터베이스에 삽입하지 못한 이유는 무엇입니까? SQLiteException의 추적은 특별히 도움이되지 않습니다.SQLiteException이 행을 삽입하지 못했습니다

예외의 원인에 대해 더 나은 정보를 얻을 수있는 방법이 있습니까? 테이블 (모든 불안정한 간격 미안) 생성

:

http://pastebin.com/iN1M8QMe

인서트를 다음 값은 SAX 파서하는 endElement에서 파싱

http://pastebin.com/QqUgdDz0

라고 부름 :

http://pastebin.com/xUqrmexw공급자 0

삽입 케이스 :

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. 는 sdcard에 사용하는 SQLite는 DB
  2. 없음 허락을 받아 사용하고 요청하는 sdcard에 백업 DB
  3. 를 사용하는 것은이 읽기 전용 복사에 행을 삽입 데이터베이스의

더 많은 것들이있을 수 있습니다.

0

"PRIMARY KEY"또는 "UNIQUE"제한을 위반하는 행을 삽입하려고했을 수 있습니다 (데이터베이스에 "고유"필드가 없음).

+1

"insert()"스 니펫을 가져 주셔서 감사합니다! "validValues"ContentValues에 대해 말할 수 있습니까? 내가 완전히 틀린 것이 아니라면 테이블에 "기본 키"id-field가 있다고 생각합니다. ContentValues ​​("validValuse")에 id-column에 대한 데이터가 있습니까? 이미 존재하는 ID를 삽입하려합니다. – dbm

2

필자의 경우 비슷한 문제가 발생했다. 삽입은 전체 테이블을 삭제 한 직후에 완료되었다.

믿거 나 말거나, 실제로 반환 된 rowId는 0이므로 행이 삽입되었지만 콘텐츠 공급자의 코드는 그렇지 않다고 생각했습니다.위한 SQLiteDatabase의 문서에서

: 삽입

행 새로 삽입 된 행의 ID -1 오류 검증

코드가 발생하면 상기 하나 인 ROWID> 0 (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; 
} 
+0

당신의 답이 제 문제를 해결했습니다. – afazolo

관련 문제