我面临当前的问题:
我有一个应用程序,其中第一个 Activity MainActivity
和第二个 Activity 称为 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()
方法被调用,所以在我看来,onCreate()
方法(通过还应该调用 HelperClass 中的 db.getWritableDatabase()
)。
神秘:创建了表 zvei
,但没有创建 fms
。因此,当我开始第二个 Activity (它调用另一个方法 getAllFms()
,类似于 getAllZvei()
,只是在此源代码中将其删除)时,它崩溃并 LogCat告诉我:
noch such table: fms
我在 Nexus 4 模拟器上运行它。删除用户数据,清除应用程序中的数据并卸载应用程序。我通过 DDMS 提取了 fms.db
并在 SQLiteBrowser 中查看,但只有 zvei 存在。
我无法解释为什么。你可以吗?
更新 我刚刚重命名了数据库名称并在 DDMS 中识别,仍然生成旧名称。因此,我只是清理并重建了项目,删除了模拟器并创建了一个新的模拟器,删除了用户数据(是的,即使我刚刚创建了它!),现在:它可以工作了!
谢谢大家!
最佳答案
我发现您正在连接两个 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 不太关心复合语句。此外,您认为通过连接获得的性能增益在连接本身和解析较大的复合语句中会丢失。
关于Android SQLite : Error creating second table in second Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16585941/