2013-10-22 3 views
0

xls-parser의 모든 행을 sqlite DB에 추가하려고합니다. 이 테이블 상반기 잘 작동하지만, 나머지는 추가되지 않은 모든 행에 대해 나에게 오류를 보내 구문 분석의xls 파일에서 SQLite로 데이터를 삽입하는 중 오류가 발생했습니다. android

10-22 20:43:32.453 17882-17882/? E/Database﹕ Error inserting null= diameter= category=Постное Меню price=180.0 weight=220.0 subcategory=Салаты name=Микс овощной composition=микс из листьев салата, черри, болгпрский перец, авокадо, кедроаые орешки, пармезан, зелень, ореховая заправка type=Уно Моменто url=http://epongorod.ru/images/stories/virtuemart/product/uno-miks-ovoshchnoj.jpg 
android.database.sqlite.SQLiteException: near "null": syntax error: , while compiling: INSERT INTO menuTable(null, diameter, category, price, weight, subcategory, name, composition, type, url) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?); 
     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36) 
     at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145) 
     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536) 
     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 
     at com.epon.MainActivity.MainActivity.onCreate(MainActivity.java:158) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
     at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:123) 
     at android.app.ActivityThread.main(ActivityThread.java:4627) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:521) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
     at dalvik.system.NativeStart.main(Native Method) 

샘플 :

if (wb != null) { 
     SQLiteDatabase db = dbHelper.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     Sheet sheet = wb.getSheetAt(0); 

     for (int i = 1; i < sheet.getLastRowNum(); i++) { 
      Row row = sheet.getRow(i); 

      for (int cn=row.getFirstCellNum(); cn<row.getLastCellNum(); cn++) { 
       Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); 
       String result = cell.toString(); 

       String name = null; 
       switch (cn) { 
        case 0: 
         name = "type"; 
         break; 
        case 1: 
         name = "category"; 
         break; 
        case 2: 
         name = "subcategory"; 
         break; 
        case 3: 
         name = "name"; 
         break; 
        case 4: 
         name = "composition"; 
         break; 

        case 5: 
         name = "weight"; 
         break; 

        case 6: 
         name = "diameter"; 
         break; 
        case 7: 
         name = "price"; 
         break; 

        case 8: 
         name = "url"; 
         break; 
       } 
       cv.put(name, result); 
      } 

      db.insert("menuTable", null, cv); 
     } 

을하고 여기를 만드는 코드입니다 표 :

@Override 
    public void onCreate(SQLiteDatabase db) { 
     String query = "CREATE TABLE " + "menuTable" + " (" + 
       "_id" + "INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "type" + "TEXT," + 
       "category" + "TEXT," + 
       "subcategory" + "TEXT," + 
       "name" + "TEXT," + 
       "composition" + "TEXT," + 
       "weight" + "TEXT," + 
       "diameter" + "TEXT," + 
       "price" + "TEXT," + 
       "url" + "TEXT);"; 
     db.execSQL(query); 
    } 

그래서 전 전체 테이블의 절반 밖에 없습니다.

+2

이름이 설정되지 않아 ContentValues의 키 중 하나가 null이됩니다. 계정 변수가 8 이상이거나 0 이하일 가능성이 있습니다. – dymmeh

+0

@dymmeh 왜 200 행이 작동합니까? –

+2

파일에 무엇이 있는지 잘 모르기 때문에 잘 모르겠습니다. INSERT INTO menuTable (null,'null은 "name"이 제대로 설정되지 않았다는 것을 의미하는 키입니다 if (name == null)에 대한 case 문을 넣고 breakpoint를 안에 넣습니다. 행의 내용과 왜 갑자기 이름이 null인지 알기 위해서. – dymmeh

답변

2

예외는 SQLite는이 코드 생성 INSERT 문에서 컬럼의 이름으로 SQLite Keyword을 허용하지 않습니다 당신을 말하는 자바의 방법입니다 : 하드

INSERT INTO menuTable(null, diameter, category, price, weight, subcategory, name, composition, type, url) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?); 

함께 생각대로로 여기에 공유, 그러나 아마이 같은 코드를 작성했습니다

   case 8: 
        name = "url"; 
        break; 

       default: 
        //name = "_id"; 
        break; 
      } 

      if(name != null && !name.isEmpty()) { 
       cv.put(name, result); 
      } 

     } 

     db.insert("menuTable", null, cv); 
    } 
} 

더 완벽하게 모든 스위치 "가능성"과 이름 변수 "미지수"을 다룰 것입니까?

관련 문제