【问题标题】:Android sqlitedatabase no such tableAndroid sqlitedatabase没有这个表
【发布时间】: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 ..
  • 类型有一个空格作为前缀,所以列名和列类型之间总是有空格。

标签: android sqlite


【解决方案1】:

在您的Column NameColumn Type 之间添加空格到您的Create Query 中,例如:

  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 + "); " 

在这里我看到你只是演示。自己改正。

【讨论】:

  • 类型有一个空格作为前缀,所以列名和列类型之间总是有空格。
  • @Diëgo 为什么要将此表创建为一个字符串?一个一个地创建
  • @M D 这确实是问题所在,我自己尝试了一下,错误消失了 :-) 换了一个,但我应该能够处理那个。
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多