gpt4 book ai didi

android - 在 getWritableDatabase/getReadableDatabase 之后未调用 onCreate

转载 作者:搜寻专家 更新时间:2023-11-01 07:38:28 26 4
gpt4 key购买 nike

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

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

另外两张 table ,我无法开始工作。除了类名和列名之外,辅助类中的代码是相同的,并且(至少在我尝试访问该表之前)使用该表的代码也几乎相同。

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

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: ,编译时:INSERT INTO players_table(achievement_id, name) VALUES(?, ?);
...

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

我想不通;我不小心对另一张 table 做对了,我做错了什么?

最佳答案

我认为问题在于您使用三个助手管理三个表,但只使用一个数据库。 SQLiteOpenHelper 管理数据库,而不是一张表。例如,它在启动时检查数据库而不是表是否存在。它已经这样做了,所以 onCreate() 不会触发。

我会用一个助手管理所有 table 。

关于android - 在 getWritableDatabase/getReadableDatabase 之后未调用 onCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com