在getWritableDatabase/getReadableDatabase之后没有调用onCreate

Bri*_*n S 2 database android

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

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

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

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

这就是它失败的地方:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个就像一个魅力.第二个结果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根本没有为那些不工作的表调用该方法.这可以解释为什么我的手机认为该表不存在,但我不知道为什么该方法没有被调用.

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

Sea*_*wen 5

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

我会用一个帮助器来管理所有表.