2014-01-23 36 views
0

我使用SQLiteOpenHelper ... 當我執行logcat的記錄錯誤時的onCreate(SQLiteDatabase DB)方法被調用程序設置了一個SQLite數據庫中的Android:的Android SQLite的語法錯誤 - 獲得更多的信息

附近的 「表」:語法錯誤

這是我的SQL語句:

db.execSQL(
       "CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
       KEY_DESCRIPTION + " TEXT NOT NULL, " + 
       KEY_REPS + " TEXT NOT NULL, " + 
       KEY_WEIGHT + " TEXT NOT NULL);"); 

當我宣佈所有的變種這樣的DATABASE_TABLE這個應該可以工作。 有沒有辦法看到實際發生了什麼問題或者我的SQL只是越野車?

任何幫助表示讚賞!

public static final String KEY_ID = "_id"; -> this could be buggy 
public static final String KEY_DESCRIPTION = "Description"; 
public static final String KEY_REPS = "Reps"; 
public static final String KEY_WEIGHT = "Weight"; 

private static final String DATABASE_NAME = "Workout"; 
private static final String DATABASE_TABLE = "Table"; 
+0

我檢查這個理智(一拉斯特勞斯)數據庫是什麼'DATABASE_TABLE'的價值? – AlexBrand

+0

你可以顯示常量的值嗎?你的語法沒問題,所以你可能使用了保留字作爲列名或表名。 – NigelK

+0

另外,我相信一個聲明'INTEGER PRIMARY KEY'的列會自動增加,而不需要'autoincrement'關鍵字 – AlexBrand

回答

0

只是一個猜測:請嘗試以下操作:

db.execSQL(
      "CREATE TABLE '" + DATABASE_TABLE + "' ('" + 
      KEY_ID + "' INTEGER PRIMARY KEY AUTOINCREMENT, '" +  
      KEY_DESCRIPTION + "' TEXT NOT NULL, '" + 
      KEY_REPS + "' TEXT NOT NULL, '" + 
      KEY_WEIGHT + "' TEXT NOT NULL);"); 

這與周圍的單引號的所有標識符如果這些標籤包含特殊。字符或保留字,這應該做的伎倆。

+0

我認爲您對特殊字符 - > public static final String KEY_ID =「_id」; – user3125138

+0

這對於'_Id'來說是沒有必要的,這在列名聲明中是很好的。 –

0

最快的方法是將您的SQL創建爲字符串。然後你可以通過Log.i顯示SQL(...

我真的需要看到你的變量的值,首先猜測它是不是像你的表名 但是從我所能看到的用你所擁有的,它看起來是正確的

我的樣本private static final String DATABASE_CREATE = "create table " + MOVES_TABLE + " (" + KEY_ID + " integer primary key autoincrement, "
+ KEY_GAME_ID + " INTEGER, " + KEY_LANGUAGE_PREF + " INTEGER, " + KEY_BOARD + " TEXT, " + KEY_POSITION + " TEXT);"

+0

會加速這個過程嗎? – user3125138

+0

不是,但是它將允許您獲取應用程序中使用的實際字符串,並將其放入像sqlitestudio或sqlite數據瀏覽器這樣的工具中,並檢查您是否以您想要的方式獲得了結果。 –

0

我使用一個輔助方法做記錄

static void logSql (SQLiteDatabase db, String sql, Object... bindArgs) { 
    if (Sanity.verboseLog) { 
     Log.i (TAG, sql); 
    } 
    db.execSQL (sql, bindArgs); 
} 

不論我訪問變量

public static class Sanity { 
    public static final boolean checked = false; 

    public static final boolean waitForDebugger = checked; 
    public static final boolean forceStartupSync = checked; 
    public static final boolean writeDbToSd = checked; 
    public static final boolean showDebugActions = checked; 
    public static final boolean debugLog = checked; 
    public static final boolean verboseLog = checked; 
    public static final boolean debugContentProvider = debugLog;