데이터베이스 테이블을 만들려고하는 서비스 (아래에 있음)가 있습니다. 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);
}
}
db.execSQL (db.toString()); 마지막 줄 onCreate() : 오타입니다? 그것은'db.execSQL (sb.toString()); '이어야합니다! 이 경우 더 나은 변수 이름을 사용하십시오. –
이상적으로 모든 데이터베이스 작업은 SQLiteOnlineHelper를 확장하는 하나의 클래스에서 수행해야합니다. 왜 데이터베이스 내의 각 테이블을 생성하기 위해 별도의 클래스가 필요합니까? –
이 문제가 발생하는지 모르겠습니다. 나는 이제'SQLite'를 배웠다. 그러나'database version '은 정수 여야한다고 생각한다. 그래서'R.string.db_version'은 틀릴 수도 있습니다. 수퍼 클래스의'생성자 '에 전달하기 전에 그것을'Integer '로 파싱 해보십시오. –