【发布时间】:2017-11-30 11:16:32
【问题描述】:
我想建立一个 GPS 数据库,其中每个表代表一次旅行。 为此,有必要通过按一个按钮来创建一个新表。
到目前为止,我已经完成了所有工作。
但我希望根据这种模式显示表格: 行程_1;行程_2; Trip_3 ...
但我总是收到表名为空的错误消息。
android.database.sqlite.SQLiteException: near "Table": syntax error (code 1): , while compiling: CREATE TABLE Trip_ (ID INTEGER PRIMARY KEY, Table TEXT)
请帮我找出我的错误。
这是我的数据库类:
public class GPSDatabase extends SQLiteOpenHelper {
String TAG = "GPSDatabase";
int tnumber = 0;
public static GPSDatabase INSTANCE = null;
private static final String DB_NAME = "eelo";
private static final int VERSION = 1;
public static String TABLE_NAME = "Trip_0";
public static final String TABLE_TRIP = "Trip_";
public static final String TABLE_COLUMN = "Table";
public static final String ID_COLUMN = "ID";
public static final String NUMBER_COLUMN = "Number";
public static final String DISTANCE_COLUMN = "Distance";
public static final String LATITUDE_COLUMN = "Latitude";
public static final String LONGITUDE_COLUMN = "Longitude";
private GPSDatabase(Context context) {
super(context, DB_NAME, null, VERSION);
}
public static GPSDatabase getInstance (final Context context){
if (INSTANCE == null){
INSTANCE = new GPSDatabase(context);
}
return INSTANCE;
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTripQuery =
"CREATE TABLE " + TABLE_TRIP + " (" + ID_COLUMN + " INTEGER PRIMARY KEY, " + TABLE_COLUMN + " TEXT)";
String createQuery;
if (tnumber==0) {
createQuery =
"CREATE TABLE " + TABLE_NAME + " (" + ID_COLUMN + " INTEGER PRIMARY KEY, " + NUMBER_COLUMN + " INTEGER DEFAULT NULL, " + DISTANCE_COLUMN + " INTEGER DEFAULT NULL, " + LATITUDE_COLUMN + " REAL DEFAULT NULL, " + LONGITUDE_COLUMN + " REAL DEFAULT NULL)";
}
else{
createQuery =
"CREATE TABLE " + getTrip(tnumber) + " (" + ID_COLUMN + " INTEGER PRIMARY KEY, " + NUMBER_COLUMN + " INTEGER DEFAULT NULL, " + DISTANCE_COLUMN + " INTEGER DEFAULT NULL, " + LATITUDE_COLUMN + " REAL DEFAULT NULL, " + LONGITUDE_COLUMN + " REAL DEFAULT NULL)";
}
db.execSQL(createTripQuery);
db.execSQL(createQuery);
Log.d(TAG, "Table created");
tnumber++;
}
在这里我得到了新旅行的表名:
public String getTrip(final long id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_TRIP, new String[]{ID_COLUMN, TABLE_COLUMN}, ID_COLUMN + " = ?", new String[]{String.valueOf(id)}, null, null, null);
String table = null;
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
table = cursor.getString(cursor.getColumnIndex(TABLE_COLUMN));
}
Log.d(TAG, "getTable: "+table);
return table;
}
这是来自 Main Activity 的 ONCLICK-Methode;
public static GPSDatabase db;
public static int tripNumber = 0;
public static boolean clicked=false;
int NAV = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
db = GPSDatabase.getInstance(this);
...
Button btn= (Button)findViewById(R.id.button3);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("new Trip ","clicked");
tripNumber++;
long newID = -1;
try{
SQLiteDatabase database = db.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(db.TABLE_COLUMN, "Trip_"+tripNumber);
newID = database.insert(db.TABLE_TRIP, null, values);
}catch (SQLiteException e){
Log.e(TAG,"insert");
}finally {
Log.d(TAG,"TableTrip insert with ID " + newID);
}
SQLiteDatabase db1;
db1 = db.getWritableDatabase();
db.TABLE_NAME = db.TABLE_TRIP+tripNumber;
String dropTable = "DROP TABLE IF EXISTS " + (db.TABLE_NAME+(tripNumber-1));
db1.execSQL(dropTable);
String createQuery =
"CREATE TABLE " + db.TABLE_NAME + " (" + db.ID_COLUMN + " INTEGER PRIMARY KEY, " + db.NUMBER_COLUMN + " INTEGER DEFAULT NULL, " + db.DISTANCE_COLUMN + " INTEGER DEFAULT NULL, " + db.LATITUDE_COLUMN + " REAL DEFAULT NULL, " + db.LONGITUDE_COLUMN + " REAL DEFAULT NULL)";
db1.execSQL(createQuery);
}
});
}
【问题讨论】:
-
table是不能用作列名的关键字。那就是语法问题。一个更大的问题是,您真的不应该像那样对数据进行建模 - 不要动态创建新表,而是保持表架构固定并将可变部分(例如行程 ID)作为数据放入。 -
好的谢谢我改造了
-
@TominB 实际上,如果您真的想要,您可以将 table 作为列名。您可以将其括在单引号、双引号、方括号或坟墓中。根据SQLite Keywords
标签: android mysql sqlite android-sqlite