2013-02-21 3 views
0

클래스의 onCreate() 메서드에서 테이블을 생성하는 명령을 작성하여 SQLiteOpenHelper 클래스를 확장했습니다. 데이터베이스를 열 때 onCreate() 메서드가 처음으로 호출됩니다. 그러나 여전히 company_boxes 테이블이 이미 존재한다고 말하는 오류가 있습니다.오류 SQL 테이블에 테이블을 이미 만들었습니다.

오픈 방법

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과 노력, 정의 whos는 문자열 아래입니다하지만 여전히 그것을주고있다 같은 오류.

다음은 표시되는 스택 추적입니다. 다른 코드는 올바른 보이기 때문에

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을 사용하지 않을 때 오류가 발생하지 않으므로 그냥 추측 할 수 있습니다. create 문에서 후행하는'; '을 제거하십시오. – Henry

답변

0

는 대부분의 경우 문제는 ; 문자입니다. 이 문자는 신비로운 문제를 일으킬 수 있으므로 DML 문에서 해당 문자를 제거하려고 시도하면 작동합니다.

onCreate()은 처음으로 db와 함께 '동작'을 사용하고 db는 항상 읽기 또는 쓰기 또는 둘 다로만 열리기 때문에 if not exists을 쿼리에 사용하면이 오류가 발생하는 이유를 이해할 수 없습니다. .

+0

그것은 여전히 ​​동일한 오류를 제공하고 있지만 조건을 가진 테이블 주위에 if (! db.isOpen())를 사용하고 있으며 나를 위해 작업을 수행하고 있습니다. 그런데 정확히 SQL 파일이 어디에 저장되는지 알고 있습니까? –

+0

그래서 데이터베이스 디렉토리 (응용 프로그램의 내부 디렉토리)에있는 응용 프로그램 경로에 있습니다. 또는 db를 복사하여 sd 카드에 저장하고 거기에서 읽을 수 있습니다. – Sajmon

0

데이터베이스 버전 번호를 변경하고 완전히 사용하면 다시 시도하십시오.