Android SQLite:在第二个Activity中创建第二个表时出错

时间:2013-05-16 11:13:03

标签: android database sqlite android-activity

我正面临当前的问题:

我的应用程序包含第一个活动MainActivity和第二个名为SecondActivity的活动。 现在,在这两个方面,我需要一个单独的表:

这是我的HelperClass:

public class FMSDatabaseHandler extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;

    private static final String FMS_TABLE_CREATE = "CREATE TABLE fms (fmsId integer primary key autoincrement, status TEXT, date TEXT, kennung TEXT);";
    private static final String ZVEI_TABLE_CREATE = "CREATE TABLE zvei (zveiId integer primary key autoincrement, schleife TEXT, date TEXT, description TEXT);";

    public static final String TABLE_FMS = "fms";
    public static final String TABLE_ZVEI = "zvei";

    public static final String COLUMN_FMS_ID = "fmsId";
    public static final String COLUMN_FMS_KENNUNG = "kennung";
    public static final String COLUMN_FMS_STATUS = "status";
    public static final String COLUMN_FMS_DATE = "date";

    public static final String COLUMN_ZVEI_ID = "zveiId";
    public static final String COLUMN_ZVEI_SCHLEIFE = "schleife";
    public static final String COLUMN_ZVEI_DATE = "date";
    public static final String COLUMN_ZVEI_DESCRIPTION = "description";

    // ----------------------------------------------------------------------
    public FMSDatabaseHandler(Context context) {
        super(context, "fms.db", null, DATABASE_VERSION);
    }

    // ----------------------------------------------------------------------
    @Override public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL(FMS_TABLE_CREATE + ZVEI_TABLE_CREATE);
            //db.execSQL(FMS_TABLE_CREATE);
            //db.execSQL(ZVEI_TABLE_CREATE);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    // ----------------------------------------------------------------------
    @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_FMS);
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_ZVEI);

      onCreate(db);
    }

    // ----------------------------------------------------------------------
    public List<ZVEI> getAllZvei() {

        List<ZVEI> zveiList = new ArrayList<ZVEI>();
        String selectQuery = "SELECT * FROM " + TABLE_ZVEI + " ORDER BY zveiId DESC";

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do {
                ZVEI zvei = new ZVEI();
                zvei.setZveiId(Integer.parseInt(cursor.getString(0)));
                zvei.setSchleife(cursor.getString(1));
                zvei.setDate(cursor.getString(2));
                zvei.setDescription(cursor.getString(3));
                zveiList.add(zvei);
            } while (cursor.moveToNext());
        }

        return zveiList;

    }

}

MainActivity开始时,getAllZvei()方法被调用,因此在我看来,也应调用来自HelperClass的onCreate()方法(通过db.getWritableDatabase()) 。 神秘:创建了表zvei,但不是fms。所以当我开始我的第二个活动(调用另一个方法,getAllFms(),类似于getAllZvei()时,只是在这里删除了它),它崩溃了,LogCat告诉我:

noch such table: fms

我在Nexus 4仿真器上运行它。擦除用户数据,清除应用程序中的数据并卸载应用程序。我通过DDMS提取fms.db并在SQLiteBrowser中查看,但只有zvei存在。

我无法解释原因。你能吗?

更新 我只是重命名了数据库名称并在DDMS中识别,但仍然生成了旧名称。所以我只是清理并重建了项目,删除了模拟器并创建了一个新模拟器,擦除了用户数据(是的,即使我刚刚创建它!)现在:它可以工作!

感谢大家!

1 个答案:

答案 0 :(得分:3)

我看到你重新连接两个SQL语句而不是单独执行它们:

public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL(FMS_TABLE_CREATE + ZVEI_TABLE_CREATE);
        //db.execSQL(FMS_TABLE_CREATE);
        //db.execSQL(ZVEI_TABLE_CREATE);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

这可能是你的问题所在。 Android SQLite并不关心复合语句。此外,您认为通过连接获得的性能提升在连接本身中丢失,并解析更大的复合语句。