2013-02-21 46 views
0

我已經編寫了創建onCreate()類的方法DatabaseManager類,它擴展了SQLiteOpenHelper類。打開數據庫時,第一次調用onCreate()方法。但仍然有一個說法表corporate_boxes已經存在。錯誤在SQL表中創建表已存在

open方法

public DatabaseManager open() { 

    ourHelper = new DatabaseManager(context); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 

} 

onCreate方法

@Override 
public void onCreate(SQLiteDatabase db) { 
db.execSQL(DATABASE_CREATE_TABLE2); 
} 

DATABASE_CREATE_TABLE2是一個字符串衛生組織定義如下,

private static final String DATABASE_CREATE_TABLE2 = "CREATE TABLE " 
+ DATABASE_TABLE2 + " (" + KEY_ROWID 
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_PRODUCT 
+ " TEXT NOT NULL, " + KEY_PRICE + " TEXT NOT NULL," + KEY_IMAGEID 
+ " TEXT NOT NULL);"; 

我也試圖與CREATE TABLE IF NOT EXISTS,但它仍然是給同樣的錯誤。

這是正在顯示的堆棧跟蹤。

02-21 07:59:38.296: E/AndroidRuntime(1984): FATAL EXCEPTION: main 
02-21 07:59:38.296: E/AndroidRuntime(1984): android.database.sqlite.SQLiteException: table corporate_boxes already exists (code 1): , while compiling: CREATE TABLE corporate_boxes (_id INTEGER PRIMARY KEY AUTOINCREMENT, _name TEXT NOT NULL, _price TEXT NOT NULL,_imageid TEXT NOT NULL); 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at appistic.services.tricouschocolates.categories.DatabaseManager.onCreate(DatabaseManager.java:199) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at appistic.services.tricouschocolates.categories.DatabaseManager.open(DatabaseManager.java:116) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at appistic.services.tricouschocolates.Products.onItemSelected(Products.java:51) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:892) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.widget.AdapterView.access$200(AdapterView.java:49) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.os.Handler.handleCallback(Handler.java:725) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.os.Looper.loop(Looper.java:137) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-21 07:59:38.296: E/AndroidRuntime(1984):  at dalvik.system.NativeStart.main(Native Method) 
+0

只是一個瘋狂的猜測,因爲當您使用CREATE TABLE IF NOT EXISTS時,錯誤沒有意義:嘗試從create語句中刪除尾隨的';'。 – Henry 2013-02-21 08:28:49

回答

0

最有可能你的問題是;字符,因爲其他的代碼看起來是正確的。這個字符可能會導致神祕的問題,所以嘗試從DML語句中刪除它,它應該起作用。

我不明白爲什麼也拋出這個錯誤時,你在查詢中使用if not exists,因爲onCreate()我只叫你第一次使用一些「動作」分貝,然後分貝總是隻開讀或寫或兩者。

+0

它仍然給出相同的錯誤,但我已經使用了一個條件爲(!db.isOpen())的表,並且它正在爲我完成工作。順便說一下,你知道SQL文件的存儲位置嗎? – 2013-02-21 14:05:38

+0

所以在數據庫目錄(應用程序的內部目錄)中的應用程序路徑。或者你可以複製數據庫並將其保存在SD卡上,並從那裏讀取。 – Sajmon 2013-02-21 19:31:45

0

更改數據庫版本號並嘗試一次可以使用完全給你。