2012-04-30 7 views
0

이 주제는 sqlite에서 새 테이블을 만드는 데 약간의 문제가 있음을 암시합니다. 이제까지 내가 내 코드로 할 수있는 일은 db에 새 테이블을 만들 수 없다는 것입니다. 만약 내가 DB를 보면 그냥 안드로이드 _ 메타 데이터 tb와 아무것도 없다. 새로 작성하는 코드는 다음과 같습니다테이블을 만들 수 없습니다. SQLite/Android

... 
this.createTable(R.string.nametable, "_id INT PRIMARY KEY, " + "parentID INT, " + "name TEXT"); 
... 

public void createTable(int id, String sql) { 
     String table = this.getStringById(id); 
     String _sql = "CREATE TABLE " + table + "(" + sql + ")"; 
     Log.d("Controller.createTable", _sql); 
     this.mCurrentConnection.rawQuery(_sql, null); 
     try { 
      Cursor c = this.Select(id, "*", null); 
      c.close(); 
      Log.d("Controller.createTable", "create finished"); 
     } catch (Exception e) { 
      Log.d("Controller.createTable", "can't create table: " + table); 
     } 
    } 

내가 열거 나 내가 다 해봤

if(this.mCurrentConnection == null || !this.mCurrentConnection.isOpen()) { 
      this.mCurrentConnection = this.mContext.openOrCreateDatabase(this.mDB, Context.MODE_PRIVATE , null); 
     } 

내 응용 프로그램의 생성자에서 DB를 만들 : 응용 프로그램을 다시 설치, DB/TB의 변화 이름을 , ";" 또는 명령의 마지막에 새로운 클린 VM으로 시도해보십시오. 내 prob 문제를 해결하는 유용한 기존 게시물/답변을 찾지 못했습니다. 내가 phpMyAdmin을에 _sql 문

CREATE TABLE name_table(_id INT PRIMARY KEY, parentID INT, name TEXT) 

을 실행할 경우 는 (MySQL의) 모든 작동합니다.

도와 주시면 기쁘게 생각합니다.

관련 알렉스

편집 : (아래 코멘트에 대한 답)

@VikramBodicherla : 그게 확률값입니다. create 문 자체는 예외를 발생시키지 않습니다. 34 : 14.834 : E/데이터베이스 (305) : 오류 삽입 parentid = -1 이름 = blabla 04-30 07 : 34 : 선택 (체크) 문은

04-30 07 던져 않습니다 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLiteException :

해당 테이블 없음 : name_table : 컴파일 중 : INSERT INTO name_table (parentid, name) VALUES (?,?); 04030 07 : 34 : 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLiteProgram.native_compile (네이티브 메소드) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : at android.database.sqlite.SQLiteProgram.compile (SQLiteProgram.java:110) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:59) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLiteStatement. (SQLiteStatement.java:41) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLiteDatabase.compileStatement (SQLiteDatabase.java:1027) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.database.sqlite.SQLi (SQLiteDatabase.java : 1286) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : : 34 : 14.834 : E/데이터베이스 (305) : unicorn.Heurazio.Controller.addName (Controller.java:156) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : 에서 unicorn.Heurazio (Controller.java:135) 04-30 07 : 34 : 14.834 : 전자/데이터베이스 (305) : 에서 유니콘. 34 : 14.834 : E/데이터베이스 (305) : android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2459) 04-30 07 : 34 : 14.834 : 전자/데이터베이스 (305) : android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2512) 04-30 07 : 34 : 14.834 : 전자/데이터베이스 (305) : android.app.ActivityThread.access $ 2200 (ActivityThread.java:119) 04-30 07:34 : 14.834 : E/데이터베이스 (305) : android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1863) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : android.os. Handler.dispatchMessage (Handler.java:99) 04-30 07 : 34 : 14.834 : 전자/데이터베이스 (305) : android.os.Looper.loop (Looper.java:123) 04-30 07:34 : 14 : 343 : E/데이터베이스 (305) : android.app.ActivityThread.main (ActivityThread.java:4363) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : java.lang.reflect .Method.invokeNative (네이티브 남 ethod) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : 에서 java.lang.reflect.Method.invoke (Method.java:521) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.runZygoteInit.java : 860) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : com.android.internal.os .ZygoteInit.main (ZygoteInit.java:618) 04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : dalvik.system.NativeStart.main에서 (기본 방법)

+0

다음을 사용해 보셨습니까? http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – xandy

+0

logcat stacktrace도 게시 할 수 있습니까? 나는 당신이 예외 상황에 처해 있다고 가정한다. –

+0

네 역시 시도했습니다. 그러나 나는이 접근법을 건너 뛰기 위해 내가 필요로하지 않았다고 생각한다. 내가 잘못 afum 경우 SQLiteOpenHelper는 업 그레 이드입니다. – Alex

답변

1

당신 정말 정말 SQLiteOpenHelper 클래스와 그와 관련된 pattern을 사용하고 싶습니다. 업그레이드 만이 아닙니다. 테이블을 깨끗하게 생성합니다.

또한, 당신의 생성 문은 아마 다음과 같아야합니다

CREATE TABLE name_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, parentID INTEGER, name TEXT) 

편집 : 당신의 추적에서, 당신의 CREATE TABLE은 실행되지 않습니다 (따라서 테이블이 존재하지 않음). SQLiteOpenHelper 및 execSQL 함수를 사용하여 테이블을 만들면 모든 설정이 완료되어야합니다.

+0

모든 primkey는 sqlite [link] (http://www.sqlite.org/faq.html#q1)에서 autoincrement입니다. hmmmm kay it (again) – Alex

+0

좋아요, 이제는 왜 효과가 없었는지 압니다. 내가 두 가지 방법 을 시도했습니다 1 : SQLiteOpenHelper이 (정확히 예처럼) 구현 -> 2 일 : SQLiteOpenHelper하지 않고 있지만에는 ExecSQL (안 rawQuery) 다시 그것을 시도 - 실수가 사용되었다>는 했다 " "execSQL"대신 "rawQuery"를 사용하십시오. 나는 "CREATE TABLE ..."이 성공하면 true를 반환한다고 생각했습니다. 그러나 명백하게 그것은 dosen't. 도움을 주셔서 감사합니다 – Alex

0

04-30 07 : 34 : 14.834 : E/데이터베이스 (305) : parentid = -1 name = blabla 04-30 07 : 34 : 14.834 : E/Database (305) : android.database.sqlite .SQLiteException :

오류 스택에 따르면 -1을 parentid로 삽입하려고합니까? 상위 키가 기본 키이며 음수 값을 허용하지 않습니다.

+0

CREATE TABLE name_table (_id INT PRIMARY KEY, parentID INT, name TEXT) | 그것은 primkey가 아닙니다;) _id는 ...;) – Alex

관련 문제