在getWritableDatabase / getReadableDatabase之后没有调用onCreate

时间:2011-09-05 07:16:25

标签: android database

我的应用程序有一个包含三个表的数据库:一个用于存储其跟踪的人员的名称,一个用于跟踪正在进行的事件,另一个用于设置缺少更好的术语。

我在应用启动时加载第一个表。我要求一个可读的数据库加载成员显示,然后我在列表更改时写入数据库。我在这里没有任何问题。

然而,另外两张桌子,我无法开始工作。辅助类中的代码与类名和列名相同,并且(至少在我尝试访问表的那一点之前)使用该表的代码几乎相同。

这是我的助手类的代码(我为每个表都有一个单独的帮助器,正如我所说,除了类名和列之外它是相同的):

public class db_MembersOpenHelper extends SQLiteOpenHelper
{
    public static final String TABLE_NAME = "members_table";
    public static final String[] COLUMN_NAMES = new String[] {
            Constants.KEY_ID,
            "name",
            "score"
    };
    private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " ("
            + COLUMN_NAMES[0] + " INTEGER PRIMARY KEY autoincrement, "
            + COLUMN_NAMES[1] + " TEXT, "
            + COLUMN_NAMES[2] + " INTEGER);";

    public db_MembersOpenHelper(Context context)
    {
        super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) { db.execSQL(TABLE_CREATE); }

    @Override
    public void  onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion + ".");
        // Do nothing. We do not have any updated DB version
    }
}

以下是我成功使用它的方法:

db_MembersOpenHelper membersDbHelper = new db_MembersOpenHelper(this);
SQLiteDatabase membersDb = membersDbHelper.getReadableDatabase();
Cursor membersResult = membersDb.query(TABLE_NAME, null, null, null, null, null, null);
members = new HashMap<String, Integer>();

membersResult.moveToFirst();
for(int r = 0; r < membersResult.getCount(); r++)
{
    members.put(membersResult.getString(1), membersResult.getInt(2));
    membersResult.moveToNext();
}
membersDb.close();

这就是失败的地方:

db_PlayersOpenHelper playersDbHelper = new db_PlayersOpenHelper(this);
final SQLiteDatabase playersDb = playersDbHelper.getWritableDatabase();
if(newGame)
{
    for(String name : players)
    {
        ContentValues row = new ContentValues();
        row.put(COLUMN_NAMES[1], name);
        row.put(COLUMN_NAMES[2], (Integer)null);
        playersDb.insert(TABLE_NAME, null, row);
    }
}

第一个就像魅力一样。第二个结果为ERROR/Database(6739): Error inserting achievement_id=null name=c android.database.sqlite.SQLiteException: no such table: players_table: , while compiling: INSERT INTO players_table(achievement_id, name) VALUES(?, ?); ...

我确实做了一些测试,并且根本没有为那些不起作用的表调用onCreate方法。这可以解释为什么我的手机认为该表不存在,但我不知道为什么该方法没有被调用。

我无法弄清楚这一点;我不小心对另一张桌子做了什么,我做错了什么呢?

4 个答案:

答案 0 :(得分:5)

我认为问题在于您使用三个帮助程序管理三个表,但只使用一个数据库。 SQLiteOpenHelper管理数据库,而非一个表。例如,它会在启动时检查数据库(而不是表)是否存在。它已经存在,因此onCreate()不会触发。

我会用一个帮手管理所有桌子。

答案 1 :(得分:0)

让我看看我是否做对了。您正在尝试使用三个表创建一个数据库。但是在创建数据库时,只创建一个表;你以某种方式在不同的地方实例化同一个数据库,并想知道为什么它的onCreate方法不被调用。这是正确的解释吗?

我的策略是尝试使用单onCreate()方法创建所有三个表。

答案 2 :(得分:0)

如果您正在使用多个表,则必须一次创建所有表。如果您先运行应用程序,稍后更新数据库,则不会升级数据库。

现在删除您的应用程序,然后再次运行它。

答案 3 :(得分:0)

还有一个解决方案,但它不合适。您可以声明onOpen方法,您可以在其中调用onCreate。并在create table字符串中的表名之前添加IF NOT EXISTS。 - Sourabh刚刚编辑