您的问题“总是只创建一个表”,这将是由于非常普遍的误解,即 DatabaseHelper.java 中的 onCreate 方法(通常称为数据库助手)每次运行应用程序时都会运行。实际上,onCreate 方法在数据库的生命周期内只会自动调用一次。
如果数据库中保存的数据可能会丢失,那么解决方法很简单,删除数据库。
- 这可以通过以下任一方式完成
- 从设置/应用程序中删除应用程序的数据或
- 从设置/应用程序中卸载应用程序
当应用重新运行时,
onCreate 方法将被调用。
在您的情况下,onUpgrade 删除表(如果存在),然后调用 onCreate 方法。作为删除应用程序数据/卸载应用程序的替代方法,可以增加数据库版本,这将导致onUpgrade 方法运行,从而重新创建表。
注意这仍会导致任何现有数据丢失。
例如:-
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 2); //<<<< CHANGED 1 to 2
Log.d("MeineAPP", "DB angelegt");
}
测试您的代码
实际的表创建语句有效,使用logDatabaseInfo from this 干净运行会产生:-
05-26 20:52:24.618 1398-1398/? D/MeineAPP: DB angelegt
05-26 20:52:24.622 1398-1398/? D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/jannikokan.de.stundenplan/databases/Stundenplan.db
Database Version = 1
Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
05-26 20:52:24.626 1398-1398/? D/SQLITE_CSU: Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table Name = Fach_table Created Using = CREATE TABLE Fach_table(IDINTEGER PRIMARY KEY,FACHNAMETEXT,FACHKUERZEL TEXT,FACHRAUMTEXT,FACHLEHRER TEXT)
Table = Fach_table ColumnName = IDINTEGER ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 1
Table = Fach_table ColumnName = FACHNAMETEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHKUERZEL ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHRAUMTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHLEHRER ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table Name = Lehrer_table Created Using = CREATE TABLE Lehrer_table(ID_LINTEGER PRIMARY KEY,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)
Table = Lehrer_table ColumnName = ID_LINTEGER ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 1
Table = Lehrer_table ColumnName = LEHRERNAMETEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERKUERZELTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERRAUMTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERMAILTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
但是,查看您的代码,您确实遇到了两种方法(zeigeFaecher 和 zeigeLehrer)的问题,因为您省略了 * 和 @987654334 之间的空格@ 即你有 *from 应该是 * from。
-
注意测试仅限于这个问题,测试绝不是说没有其他方面会或不会导致问题。
附加 - 保留数据(简单解决方案)
如果您有需要保存的数据,那么您将必须设计一种保存数据的方法。
它可以像添加检查以查看预期的表是否存在以及是否创建它们一样简单,例如您可以在 Databasehelper.java 中添加/添加以下内容:-
例如:-
// This is the publicly accessible driver that has the core lists
// i.e. the list of tables that should exist and the
// corresponding table create statements which are passed to
// the createTablesThatDoNotExist method
public void addAnyNewTables() {
String[] required_tables = new String[]{
TABLE_NAME,
TABLE_LEHRER
};
String[] table_create_statements = new String[] {
create_Table,
create_Table2
};
createTablesThatDoNotExist(required_tables,table_create_statements);
}
// This method checks the validity lengths and count of the 2 arrays
// loping through them if valid pass the table and the create statement to the
// doCheckAndCreateOfTable method.
private void createTablesThatDoNotExist(String[] required_tables, String[] table_create_statements) {
// If no tables or table create statements then finish
if (required_tables.length < 1 || table_create_statements.length < 1) {
return;
}
// elements in arrays must match
if (required_tables.length != table_create_statements.length) {
return;
}
SQLiteDatabase db = this.getWritableDatabase();
String whereclause = "name";
for (int i=0; i < required_tables.length;i++) {
if (required_tables[i].length() > 0 && table_create_statements[i].length() > 0) {
doCheckAndCreateOfTable(
required_tables[i].toString(),
table_create_statements[i].toString()
);
}
}
}
// This does the real work by interrogatin sqlite_master to see if the table
// exists. If not then it runs the query to create the table using the
// create_statement passed.
private void doCheckAndCreateOfTable(String table,String create_statement) {
SQLiteDatabase db = this.getWritableDatabase();
String whereclause = "name=? AND type=?";
String[] whereargs = new String[]{table,"table"};
String table_to_query = "sqlite_master";
Cursor csr = db.query(table_to_query,null,whereclause,whereargs,null,null,null);
if (csr.getCount() < 1) {
db.execSQL(create_statement);
}
csr.close();
}
然后,您可以在获取 DatabaseHelper 的实例后在初始活动中调用它,例如:-
mDBHlpr = new DatabaseHelper(this);
mDBHlpr.addAnyNewTables();
SQLiteDatabase db = mDBHlpr.getWritableDatabase();
CommonSQLiteUtilities.logDatabaseInfo(db);
上面的测试是通过注释掉第二个表的创建,删除应用程序的数据(以及数据库)然后使用onCreate中的以下内容运行应用程序(故意不创建第二个表)
public void onCreate(SQLiteDatabase db) {
Log.d("MeineAPP", "Tabelle angelegt");
// db.execSQL("create table " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, FACHNAME TEXT, FACHKUERZEL TEXT, FACHRAUM TEXT, FACHLEHRER TEXT)");
db.execSQL(create_Table);
//db.execSQL(create_Table2); //<<<< COMMENTED OUT FOR TEST
}
结果输出是:-
05-26 21:16:07.672 1742-1742/? D/MeineAPP: DB angelegt
05-26 21:16:07.672 1742-1744/? D/dalvikvm: GC_CONCURRENT freed 236K, 10% free 6158K/6791K, paused 11ms+0ms, total 15ms
05-26 21:16:07.708 1742-1742/? D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/jannikokan.de.stundenplan/databases/Stundenplan.db
Database Version = 1
Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table Name = Fach_table Created Using = CREATE TABLE Fach_table(IDINTEGER PRIMARY KEY,FACHNAMETEXT,FACHKUERZEL TEXT,FACHRAUMTEXT,FACHLEHRER TEXT)
Table = Fach_table ColumnName = IDINTEGER ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 1
Table = Fach_table ColumnName = FACHNAMETEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHKUERZEL ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHRAUMTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Fach_table ColumnName = FACHLEHRER ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table Name = Lehrer_table Created Using = CREATE TABLE Lehrer_table(ID_LINTEGER PRIMARY KEY,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)
Table = Lehrer_table ColumnName = ID_LINTEGER ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 1
Table = Lehrer_table ColumnName = LEHRERNAMETEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERKUERZELTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERRAUMTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
Table = Lehrer_table ColumnName = LEHRERMAILTEXT ColumnType = Default Value = null PRIMARY KEY SEQUENCE = 0
即两个表都已创建