对于我的应用程序,我需要在我的数据库中创建2个不同的表,我的问题是始终只创建了一个表。
这是DatabaseHelper类的核心: -
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Stundenplan.db";
public static final String TABLE_NAME = "Fach_table";
public static final String FACH_ID = "ID";
public static final String FACH_NAME = "FACHNAME";
public static final String FACH_KUERZEL = "FACHKUERZEL";
public static final String FACH_RAUM = "FACHRAUM";
public static final String FACH_LEHRER = "FACHLEHRER";
public static final String FACH_FARBE = "FACHFARBE";
public static final String TABLE_LEHRER = "Lehrer_table";
public static final String LEHRERID = "ID_L";
public static final String LEHRERNAME = "LEHRERNAME";
public static final String LEHRERKUERZEL = "LEHRERKUERZEL";
public static final String LEHRERRAUM = "LEHRERRAUM";
public static final String LEHRERMAIL = "LEHRERMAIL";
private static final String create_Table2 = "create table " + TABLE_LEHRER + "("+ LEHRERID +"INTEGER PRIMARY KEY," + LEHRERNAME +"TEXT," + LEHRERKUERZEL + "TEXT,"+ LEHRERRAUM + "TEXT," + LEHRERMAIL + "TEXT)";
private static final String create_Table = "create table " + TABLE_NAME + "("+ FACH_ID + "INTEGER PRIMARY KEY," + FACH_NAME +"TEXT," + FACH_KUERZEL + " TEXT,"+ FACH_RAUM + "TEXT," + FACH_LEHRER + " TEXT)";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
Log.d("MeineAPP", "DB angelegt");
}
@Override
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);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
// db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME );
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
db.execSQL( "DROP TABLE IF EXISTS " + TABLE_LEHRER);
onCreate(db);
Log.d("MeineAPP", "in upgrade");
}
...........
}
请帮忙!
答案 0 :(得分:0)
您的问题“始终只创建了一个表”,这是由于 onCreate
方法在 DatabaseHelper.java 中的常见误解(通常称为数据库助手)每次运行应用程序时都会运行。实际上,onCreate
方法仅在数据库的生命周期内自动调用一次。
如果数据库中保存的数据可能丢失,那么修复就是删除数据库。
onCreate
方法。在您的情况下,onUpgrade
删除表(如果存在),然后调用onCreate
方法。作为删除应用程序数据/卸载应用程序的替代方法,将增加数据库版本,这将导致运行onUpgrade
方法,从而重新创建表。
注意这仍然会导致任何现有数据丢失。
e.g。 : -
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
)的问题,因为您在 *
之间省略了空格并且 from
即您 *from
应该 * from
。
如果您需要保存数据,则必须设计一种保存数据的方法。
这可以像添加检查一样简单,以查看预期的表是否存在,如果不存在,例如您可以在Databasehelper.java中添加/添加以下内容: -
e.g。 : -
// 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
<强>即。两个表都已创建