【发布时间】:2014-02-21 10:48:07
【问题描述】:
在我的 SQLiteOpenHelper 类中处理我的数据库时,我得到一个“没有这样的表”错误,即使调用了 onCreate 方法并且我在该方法中创建了表结构。
public class BVCDbHelper extends SQLiteOpenHelper {
// Increment when db schema changes
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "BVC.db";
private static final String INTEGER_TYPE = " INTEGER";
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + Games.TABLE_NAME + " (" +
Games._ID + TEXT_TYPE + " PRIMARY KEY," +
Games.COLUMN_NAME_HOME + TEXT_TYPE + COMMA_SEP +
Games.COLUMN_NAME_GUESTS + TEXT_TYPE + COMMA_SEP +
Games.COLUMN_NAME_TIMESTAMP + INTEGER_TYPE + "); " +
"CREATE TABLE " + Sets.TABLE_NAME + " (" +
Sets._ID + INTEGER_TYPE + " PRIMARY KEY," +
Sets.COLUMN_NAME_GAME_CODE + TEXT_TYPE + COMMA_SEP +
Sets.COLUMN_NAME_HOME + INTEGER_TYPE + COMMA_SEP +
Sets.COLUMN_NAME_GUESTS + INTEGER_TYPE + "); " +
"CREATE TABLE " + Teams.TABLE_NAME + " (" +
Teams._ID + TEXT_TYPE + " PRIMARY KEY," +
Teams.COLUMN_NAME_NAME + TEXT_TYPE + "); " +
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + Games.TABLE_NAME
+ "; DROP TABLE IF EXISTS " + Sets.TABLE_NAME
+ "; DROP TABLE IF EXISTS " + Teams.TABLE_NAME
public BVCDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
Log.i("BVCDbHelper", "Table structures created in " + db.getPath());
}
错误:
android.database.sqlite.SQLiteException: no such table: team (code 1): , while compiling:
SELECT _id, teamName FROM team WHERE _id=? OR _id=?
onCreate 执行没有问题,并且不会产生错误。产生此错误的方法尝试插入游戏,当我插入游戏时它不会返回此类错误。这可能是什么原因?
/** Create team */
public void addTeam(Team t){
ContentValues values = new ContentValues();
values.put(Teams._ID, t.getCode());
values.put(Teams.COLUMN_NAME_NAME, t.getName());
insert(Teams.TABLE_NAME, null, values);
}
/** General insert method */
private void insert(String tableName, String nullColumnHack, ContentValues values){
SQLiteDatabase db = this.getWritableDatabase();
db.insertOrThrow(tableName, nullColumnHack, values);
db.close();
}
或者我应该尝试为每个表使用单独的语句(和 execSQL 方法)而不是一个表来创建我的表?
更新:我需要一张一张地创建表格。这解决了我的问题。我现在有带有创建和删除条目的 ArrayList,当我需要创建或删除我的结构时,我会循环访问它们。
【问题讨论】:
-
您在创建查询时出错了。您需要在列名和列类型之间提供空格
-
逗号后需要空格:.. PRIMARY KEY," + Games.COLUMN_NAME_HOME + TEXT_TYPE + COMMA_S ..
-
类型有一个空格作为前缀,所以列名和列类型之间总是有空格。