我的应用程序有一个包含三个表的数据库:一个用于存储其跟踪的人员的名称,一个用于跟踪正在进行的事件,另一个用于设置缺少更好的术语。
我在应用启动时加载第一个表。我要求一个可读的数据库加载成员显示,然后我在列表更改时写入数据库。我在这里没有任何问题。
然而,另外两张桌子,我无法开始工作。辅助类中的代码与类名和列名相同,并且(至少在我尝试访问表的那一点之前)使用该表的代码几乎相同。
这是我的助手类的代码(我为每个表都有一个单独的帮助器,正如我所说,除了类名和列之外它是相同的):
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
方法。这可以解释为什么我的手机认为该表不存在,但我不知道为什么该方法没有被调用。
我无法弄清楚这一点;我不小心对另一张桌子做了什么,我做错了什么呢?
答案 0 :(得分:5)
我认为问题在于您使用三个帮助程序管理三个表,但只使用一个数据库。 SQLiteOpenHelper
管理数据库,而非一个表。例如,它会在启动时检查数据库(而不是表)是否存在。它已经存在,因此onCreate()
不会触发。
我会用一个帮手管理所有桌子。
答案 1 :(得分:0)
让我看看我是否做对了。您正在尝试使用三个表创建一个数据库。但是在创建数据库时,只创建一个表;你以某种方式在不同的地方实例化同一个数据库,并想知道为什么它的onCreate
方法不被调用。这是正确的解释吗?
我的策略是尝试使用单onCreate()
方法创建所有三个表。
答案 2 :(得分:0)
如果您正在使用多个表,则必须一次创建所有表。如果您先运行应用程序,稍后更新数据库,则不会升级数据库。
现在删除您的应用程序,然后再次运行它。
答案 3 :(得分:0)
还有一个解决方案,但它不合适。您可以声明onOpen方法,您可以在其中调用onCreate。并在create table字符串中的表名之前添加IF NOT EXISTS。 - Sourabh刚刚编辑