Android Java - OnCreate 执行,但无法创建表?
Android Java - OnCreate executes, but fails to create tables?
我正在做我的第一个 Android 项目(完全公开,这是一个学校项目)。我必须承认,我发现它比我预期的要复杂得多。无论如何,这是我的问题。
我创建了一个 DBHelper class:
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "asteroids.sqlite";
private static final int DB_VERSION = 1;
public DBHelper(Context context)
{
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
System.out.println("DB HELPER ON CREATE FUNCTION HERE!!!!");
db.beginTransaction();
resetAsteroidsTable(db);
// Call functions to create each table.
// Create/Reset BGObject Table
resetBGObjectsTable(db);
// GameLevels
resetGameLevelsTable(db);
// Level Objects
resetLevelObjectsTable(db);
// Level Asteroids
resetLevelAsteroidsTable(db);
// Main Bodies
resetMainBodiesTable(db);
// Cannons
resetCannonsTable(db);
// Extra Parts
resetExtraPartsTable(db);
// Engines
resetEnginesTable(db);
// Power Cores
resetPowerCoresTable(db);
db.setTransactionSuccessful();
db.endTransaction();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
return;
}
被调用以创建个人 table 的函数格式如下:
public void resetAsteroidsTable(SQLiteDatabase db)
{
// Create/Reset Asteroids Table
final String SQL =
"DROP TABLE IF EXISTS ASTEROIDS; " +
"CREATE TABLE ASTEROIDS " +
"(" +
" ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
" IMAGEPATH TEXT NOT NULL, " +
" IMAGEWIDTH INTEGER NOT NULL, " +
" IMAGEHEIGHT INTEGER NOT NULL, " +
" ASTYPE TEXT NOT NULL " +
");";
System.out.println("Create the ASTEROIDS database!");
System.out.println(SQL);
db.execSQL(SQL);
我已经手动检查了 create table SQL 语句,它们确实有效。
但是,当我调用这个函数时也发现在DBHelper中插入数据到其中一个table中。
public boolean executeSqlStatement(String SQLStatement)
{
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
db.execSQL(SQLStatement);
db.setTransactionSuccessful();
db.endTransaction();
return true;
}
我收到错误:
android.database.sqlite.SQLiteException: no such table: ASTEROIDS (code 1):
我很困惑,因为我知道会调用 onCreate,因为我在 logcat 中看到了我的打印语句。每次我 运行 我的测试执行此操作时,我都会清除应用程序数据,并且我确实可以访问我使用 humpty 脚本获得的数据库转储。数据库模式仅显示一个名为 android_metadata 的 table,empty.I 已经在线查找了几个小时,我非常感谢这里的任何指示。
exeqSQL()
只执行一个 SQL 语句。您需要将您的 SQL 分成单独的呼叫,一个用于 DROP TABLE
,另一个用于 CREATE TABLE
。请注意 onCreate()
仅在数据库文件不存在时调用,因此实际上不需要 DROP TABLE
。
另一个问题是 SQLiteOpenHelper
生命周期方法,例如 onCreate()
是在事务内部调用的。您不应该自己启动嵌套事务。 SQLite 本身不支持嵌套事务,Android 的 SQLite wrapper 只增加了对事务嵌套的部分支持。
我正在做我的第一个 Android 项目(完全公开,这是一个学校项目)。我必须承认,我发现它比我预期的要复杂得多。无论如何,这是我的问题。
我创建了一个 DBHelper class:
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "asteroids.sqlite";
private static final int DB_VERSION = 1;
public DBHelper(Context context)
{
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
System.out.println("DB HELPER ON CREATE FUNCTION HERE!!!!");
db.beginTransaction();
resetAsteroidsTable(db);
// Call functions to create each table.
// Create/Reset BGObject Table
resetBGObjectsTable(db);
// GameLevels
resetGameLevelsTable(db);
// Level Objects
resetLevelObjectsTable(db);
// Level Asteroids
resetLevelAsteroidsTable(db);
// Main Bodies
resetMainBodiesTable(db);
// Cannons
resetCannonsTable(db);
// Extra Parts
resetExtraPartsTable(db);
// Engines
resetEnginesTable(db);
// Power Cores
resetPowerCoresTable(db);
db.setTransactionSuccessful();
db.endTransaction();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
return;
}
被调用以创建个人 table 的函数格式如下:
public void resetAsteroidsTable(SQLiteDatabase db)
{
// Create/Reset Asteroids Table
final String SQL =
"DROP TABLE IF EXISTS ASTEROIDS; " +
"CREATE TABLE ASTEROIDS " +
"(" +
" ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
" IMAGEPATH TEXT NOT NULL, " +
" IMAGEWIDTH INTEGER NOT NULL, " +
" IMAGEHEIGHT INTEGER NOT NULL, " +
" ASTYPE TEXT NOT NULL " +
");";
System.out.println("Create the ASTEROIDS database!");
System.out.println(SQL);
db.execSQL(SQL);
我已经手动检查了 create table SQL 语句,它们确实有效。
但是,当我调用这个函数时也发现在DBHelper中插入数据到其中一个table中。
public boolean executeSqlStatement(String SQLStatement)
{
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
db.execSQL(SQLStatement);
db.setTransactionSuccessful();
db.endTransaction();
return true;
}
我收到错误:
android.database.sqlite.SQLiteException: no such table: ASTEROIDS (code 1):
我很困惑,因为我知道会调用 onCreate,因为我在 logcat 中看到了我的打印语句。每次我 运行 我的测试执行此操作时,我都会清除应用程序数据,并且我确实可以访问我使用 humpty 脚本获得的数据库转储。数据库模式仅显示一个名为 android_metadata 的 table,empty.I 已经在线查找了几个小时,我非常感谢这里的任何指示。
exeqSQL()
只执行一个 SQL 语句。您需要将您的 SQL 分成单独的呼叫,一个用于 DROP TABLE
,另一个用于 CREATE TABLE
。请注意 onCreate()
仅在数据库文件不存在时调用,因此实际上不需要 DROP TABLE
。
另一个问题是 SQLiteOpenHelper
生命周期方法,例如 onCreate()
是在事务内部调用的。您不应该自己启动嵌套事务。 SQLite 本身不支持嵌套事务,Android 的 SQLite wrapper 只增加了对事务嵌套的部分支持。