我的应用程序有一个包含三个表的数据库:一个用于存储其跟踪的人员的名称,一个用于跟踪正在进行的事件,另一个用于设置缺少更好的术语.
我在应用程序启动时加载第一个表.我要求一个可读的数据库加载成员显示,然后我在列表更改时写入数据库.我在这里没有问题.
然而,另外两张桌子,我无法上班.辅助类中的代码与类名和列名的例外相同,并且(至少在我尝试访问表的那一点之前)使用该表的代码也几乎相同.
这是我的助手类的代码(我为每个表都有一个单独的帮助器,正如我所说,除了类名和列之外它是相同的):
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根本没有为那些不工作的表调用该方法.这可以解释为什么我的手机认为该表不存在,但我不知道为什么该方法没有被调用.
我无法弄清楚这一点; 我不小心对另一张桌子做了什么,我怎么做错了?
我认为问题在于您使用三个帮助程序管理三个表,但只使用一个数据库.SQLiteOpenHelper管理数据库,而不是一个表.例如,它会在启动时检查数据库(而不是表)是否存在.它已经存在,所以onCreate()不会发射.
我会用一个帮助器来管理所有表.
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |