2016-02-01 80 views
-2

我想從edittext插入數據到數據庫,但我得到這些錯誤,並不能解決它。我創建了DBHelper,代碼如下,就像在DB中添加數據的類一樣。也是構造函數和getters和setter。我真的需要一些幫助。ANDROID:引起:java.lang.reflect.InvocationTargetException

02-01 22:22:07.180 23428-23428/? E/SQLiteLog: (1) AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY 
02-01 22:22:07.200 23428-23428/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x42020540) 
02-01 22:22:07.380 23428-23428/? E/AndroidRuntime: FATAL EXCEPTION: main 
           java.lang.IllegalStateException: Could not execute method for android:onClick 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275) 
at android.view.View.performClick(View.java:4102) 
at android.view.View$PerformClick.run(View.java:17085) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:155) 
at android.app.ActivityThread.main(ActivityThread.java:5520) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
at android.view.View.performClick(View.java:4102)  
at android.view.View$PerformClick.run(View.java:17085)  
at android.os.Handler.handleCallback(Handler.java:615)  
at android.os.Handler.dispatchMessage(Handler.java:92)  
at android.os.Looper.loop(Looper.java:155)  
at android.app.ActivityThread.main(ActivityThread.java:5520)  
at java.lang.reflect.Method.invokeNative(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:511)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)  
at dalvik.system.NativeStart.main(Native Method)  
Caused by: android.database.sqlite.SQLiteException: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: CREATE TABLE Logs(_idINTEGER PRIMARY KEY AUTOINCREMENT,titleTEXT,plate_numberTEXT,sort_idTEXT,gradeTEXT,diameterTEXT,lengthTEXT,survey_idINTEGER AUTOINCREMENT); 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:909) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:520) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1719) 
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1650) 
at com.example.matija.ams.LogsDBHandler.onCreate(LogsDBHandler.java:51) 
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
at com.example.matija.ams.LogsDBHandler.addLogs(LogsDBHandler.java:62) 
at com.example.matija.ams.AddLogs.saveButtonClicked(AddLogs.java:55) 
at java.lang.reflect.Method.invokeNative(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:511)  
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)  
at android.view.View.performClick(View.java:4102)  
at android.view.View$PerformClick.run(View.java:17085)  
at android.os.Handler.handleCallback(Handler.java:615)  
at android.os.Handler.dispatchMessage(Handler.java:92)  
at android.os.Looper.loop(Looper.java:155)  
at android.app.ActivityThread.main(ActivityThread.java:5520)  
at java.lang.reflect.Method.invokeNative(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:511)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)  
at dalvik.system.NativeStart.main(Native Method)  
02-01 22:22:09.240 23428-23428/? D/Process: killProcess, pid=23428 
02-01 22:22:09.270 23428-23428/? D/Process: dalvik.system.VMStack.getThreadStackTrace(Native Method) 
02-01 22:22:09.270 23428-23428/? D/Process: java.lang.Thread.getStackTrace(Thread.java:599) 
02-01 22:22:09.270 23428-23428/? D/Process: android.os.Process.killProcess(Process.java:956) 
02-01 22:22:09.270 23428-23428/? D/Process: com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:108) 
02-01 22:22:09.270 23428-23428/? D/Process: java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
02-01 22:22:09.270 23428-23428/? D/Process: java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 
02-01 22:22:09.270 23428-23428/? D/Process: dalvik.system.NativeStart.main(Native Method) 

這是我DbHandler與add方法

public class LogsDBHandler extends SQLiteOpenHelper { 

    //DB version 
    private static final int DATABASE_VERSION = 11; 
    // DB name 
    private static final String DATABASE_NAME = "Log"; 

    //table name 
    public static final String TABLE_LOGS = "Logs"; 
    public static final String TABLE_SURVEY = "SURVEY"; 

    //TableLogs column names 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_TITLE = "title"; 
    public static final String KEY_PLATE_NUMBER = "plate_number"; 
    public static final String KEY_SORTID = "sort_id"; 
    public static final String KEY_GRADE = "grade"; 
    public static final String KEY_DIAMETER = "diameter"; 
    public static final String KEY_LENGTH = "length"; 
    public static final String KEY_SURVEYID = "survey_id"; 

    //TableSurvey column names 
    public static final String KEY_CREATEDAT = "created_at"; 
    public static final String KEY_SURVEY_TITLE = "survey_title"; 
    public static final String KEY_STATE = "state"; 

    public LogsDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_LOGS_TABLE = "CREATE TABLE " + TABLE_LOGS + "(" + 
       KEY_ID + "INTEGER PRIMARY KEY AUTOINCREMENT," + 
       KEY_TITLE + "TEXT," + KEY_PLATE_NUMBER + "TEXT," + 
       KEY_SORTID + "TEXT," + KEY_GRADE + "TEXT," + 
       KEY_DIAMETER + "TEXT," + KEY_LENGTH + "TEXT," + 
       KEY_SURVEYID + "INTEGER AUTOINCREMENT" +");"; 
     db.execSQL(CREATE_LOGS_TABLE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGS); 
     onCreate(db); 
    } 

    //add new row 
    public void addLogs(Logs log) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_TITLE, log.get_title()); 
     values.put(KEY_PLATE_NUMBER, log.get_plate_number()); 
     values.put(KEY_SORTID, log.get_sort_id()); 
     values.put(KEY_GRADE, log.get_grade()); 
     values.put(KEY_DIAMETER, log.get_diameter()); 
     values.put(KEY_LENGTH, log.get_length()); 
     db.insert(TABLE_LOGS, null, values); 
     db.close(); 
    } 
} 

所以下面的代碼是從的EditText將數據添加到數據庫中。如果有什麼不對,請告訴我。所以這是所有的代碼(我沒有把代碼與構造函數,getters和setter)。所以我有人知道什麼是問題請說寫。謝謝。

+0

當讀取logcat時,錯誤是由「最低」錯誤引起的,所以'SQLiteException:AUTOINCREMENT只允許在INTEGER PRIMARY KEY' –

+0

謝謝,那就是問題所在,現在它可以工作。 – RubyDigger19

+0

儘管如此,您仍然需要在列名稱周圍留出空隙。 –

回答

0

您的SQL格式不正確。列名與其他屬性之間沒有空格。這就是爲什麼異常的根本原因是:

Caused by: android.database.sqlite.SQLiteException: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: CREATE TABLE Logs(_idINTEGER PRIMARY KEY AUTOINCREMENT,titleTEXT,plate_numberTEXT,sort_idTEXT,gradeTEXT,diameterTEXT,lengthTEXT,survey_idINTEGER AUTOINCREMENT); 

在你的onCreate回調請看:

String CREATE_LOGS_TABLE = "CREATE TABLE " + TABLE_LOGS + "(" + 
      KEY_ID + "INTEGER PRIMARY KEY AUTOINCREMENT," + 
      KEY_TITLE + "TEXT," + KEY_PLATE_NUMBER + "TEXT," + 
      KEY_SORTID + "TEXT," + KEY_GRADE + "TEXT," + 
      KEY_DIAMETER + "TEXT," + KEY_LENGTH + "TEXT," + 
      KEY_SURVEYID + "INTEGER AUTOINCREMENT" +");"; 

如果你要手動構建SQL字符串,而不是使用遷移庫如遷飛,您需要確保您的SQL根據標準格式化。

+0

如果你要提到Flyway,至少可以鏈接到一些文檔,以便比手動構建SQL字符串更好 –

相關問題