2013-06-16 2 views
1

데이터베이스 테이블을 만들려고하는 서비스 (아래에 있음)가 있습니다. PlayerTable에서 onCreate() 내의 SQL이 실행될 때 이해가 안되는 예외가 발생합니다. 모든 코드는 아래에 나열되어 있습니다. 기본적으로 서비스는 시작되고 SQLiteDatabase 객체를 가져오고 CodyBuddyOpenHelper에서 onCreate()를 호출하여 PlayerTable에서 onCreate()를 호출합니다. SQL이 실행될 때 예외가 발생합니다. 어떤 도움을 주시면 감사하겠습니다.데이터베이스를 만들 때 SQLiteException - "android"근처의 SQLiteException

06-03 00:47:43.043: E/AndroidRuntime(4347): FATAL EXCEPTION: IntentService[NewGameService] 
06-03 00:47:43.043: E/AndroidRuntime(4347): android.database.sqlite.SQLiteException: near "android": syntax error 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:90) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1899) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at ws.hamacher.cluebuddy.db.PlayerTable.onCreate(PlayerTable.java:32) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at ws.hamacher.cluebuddy.db.ClueBuddyOpenHelper.onCreate(ClueBuddyOpenHelper.java:30) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at ws.hamacher.cluebuddy.service.NewGameService.onHandleIntent(NewGameService.java:18) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.os.Looper.loop(Looper.java:137) 
06-03 00:47:43.043: E/AndroidRuntime(4347):  at android.os.HandlerThread.run(HandlerThread.java:60) 

코드 :

public class ClueBuddyOpenHelper extends SQLiteOpenHelper { 

    private static ClueBuddyOpenHelper instance = null; 

    private ClueBuddyOpenHelper(final Context context) { 
     super(context, context.getString(R.string.db_name), null, R.string.db_version); 
    } 

    public static ClueBuddyOpenHelper getInstance(Context context) { 
     if (instance == null) { 
      instance = new ClueBuddyOpenHelper(context.getApplicationContext()); 
     } 
     return instance; 
    } 

    @Override 
    public void onOpen(final SQLiteDatabase db) { 
     super.onOpen(db); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     PlayerTable.onCreate(db); 
     MoveTable.onCreate(db); 
     TurnTable.onCreate(db); 
     PersonTable.onCreate(db); 
     WeaponTable.onCreate(db); 
     RoomTable.onCreate(db); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

} 


public class PlayerTable { 

    public static final String TABLE_NAME = "player"; 

    public static class PlayerColumns { 
     public static final String PLAYER_ID = "player_id"; 
     public static final String TOKEN = "token"; 
     public static final String NUMBER_OF_CARDS = "number_of_cards"; 
     public static final String USER_IS_PLAYER = "user_is_player"; 
     public static final String ACTIVE = "active"; 
    } 

    public static void onCreate(SQLiteDatabase db) { 
     StringBuilder sb = new StringBuilder(""); 
     sb.append("CREATE TABLE "); 
     sb.append(PlayerTable.TABLE_NAME); 
     sb.append(" ("); 
     sb.append(PlayerColumns.PLAYER_ID); 
     sb.append(" INTEGER PRIMARY KEY, "); 
     sb.append(PlayerColumns.TOKEN); 
     sb.append(" TEXT UNIQUE NOT NULL, "); 
     sb.append(PlayerColumns.NUMBER_OF_CARDS); 
     sb.append(" INTEGER NOT NULL, "); 
     sb.append(PlayerColumns.USER_IS_PLAYER); 
     sb.append(" TEXT, "); 
     sb.append(PlayerColumns.ACTIVE); 
     sb.append(" TEXT NOT NULL);"); 
     db.execSQL(db.toString()); 
    } 

} 


public class NewGameService extends IntentService { 

    public NewGameService() { 
     super("NewGameService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     SQLiteDatabase db = ClueBuddyOpenHelper.getInstance(this).getWritableDatabase(); 
     db.execSQL("DELETE FROM player;"); 
     db.execSQL("DELETE FROM turn;"); 
     db.execSQL("DELETE FROM move;"); 
     db.execSQL("DELETE FROM person;"); 
     db.execSQL("DELETE FROM weapon;"); 
     db.execSQL("DELETE FROM room;"); 


     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName()); 
     //broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); 
     sendBroadcast(broadcastIntent); 
    } 

} 
+3

db.execSQL (db.toString()); 마지막 줄 onCreate() : 오타입니다? 그것은'db.execSQL (sb.toString()); '이어야합니다! 이 경우 더 나은 변수 이름을 사용하십시오. –

+0

이상적으로 모든 데이터베이스 작업은 SQLiteOnlineHelper를 확장하는 하나의 클래스에서 수행해야합니다. 왜 데이터베이스 내의 각 테이블을 생성하기 위해 별도의 클래스가 필요합니까? –

+0

이 문제가 발생하는지 모르겠습니다. 나는 이제'SQLite'를 배웠다. 그러나'database version '은 정수 여야한다고 생각한다. 그래서'R.string.db_version'은 틀릴 수도 있습니다. 수퍼 클래스의'생성자 '에 전달하기 전에 그것을'Integer '로 파싱 해보십시오. –

답변

1

으로는 귀도 지적, 당신은

db.execSQL(db.toString()); 

에 변경해야합니다 : 그것은의 문자열 해석을 보내는

db.execSQL(sb.toString()); 

당신의 db 개체를 SQL 문으로 사용합니다.

+0

영주. . . 감사! – badgerduke

관련 문제