我有两款Android手机,分别是Sumsung Galaxy s3(Android 4.4.2,Kitkat,API19)和Nexus 6p(Android 6.0.1,Marshmallow,API23)。
这是我的DatabaseHelper
课程:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = DatabaseHelper.class.getSimpleName();
public DatabaseHelper(Context context) {
super(context, DatabaseContract.DATABASE_NAME, null, DatabaseContract.DATABASE_VERSION);
Log.v(LOG_TAG, "DatabaseHelper() executed.");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.v(LOG_TAG, "onCreate() executed.");
Log.v(LOG_TAG, DatabaseContract.PerformanceTable.PERFORMANCE_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.PlayerTable.PLAYER_TABLE_CREATION);
Log.v(LOG_TAG, DatabaseContract.TeamTable.TEAM_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt3Table.Pt3_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt2Table.Pt2_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt1Table.Pt1_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.StealTable.STEAL_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.BlockTable.BLOCK_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.OffRebTable.OFFREB_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.DefRebTable.DEFREB_TABLE_CREATION_QUERY);
Log.v(LOG_TAG, DatabaseContract.AssistTable.ASSIST_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.PerformanceTable.PERFORMANCE_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.PlayerTable.PLAYER_TABLE_CREATION);
db.execSQL(DatabaseContract.TeamTable.TEAM_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.Pt3Table.Pt3_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.Pt2Table.Pt2_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.Pt1Table.Pt1_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.StealTable.STEAL_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.BlockTable.BLOCK_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.OffRebTable.OFFREB_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.DefRebTable.DEFREB_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.AssistTable.ASSIST_TABLE_CREATION_QUERY);
db.execSQL(DatabaseContract.TurnoverTable.TURNOVER_TABLE_CREATION_QUERY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v(LOG_TAG, "onUpgrade() executed.");
Log.v(LOG_TAG, DatabaseContract.PerformanceTable.PERFORMANCE_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.PlayerTable.PLAYER_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.TeamTable.TEAM_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt3Table.PT3_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt2Table.PT2_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.Pt1Table.PT1_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.StealTable.STEAL_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.BlockTable.BLOCK_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.OffRebTable.OFFREB_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.DefRebTable.DEFREB_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.AssistTable.ASSIST_TABLE_DELETION_QUERY);
Log.v(LOG_TAG, DatabaseContract.TurnoverTable.TURNOVER_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.TeamTable.TEAM_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.PlayerTable.PLAYER_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.Pt3Table.PT3_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.Pt2Table.PT2_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.Pt1Table.PT1_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.StealTable.STEAL_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.BlockTable.BLOCK_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.OffRebTable.OFFREB_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.DefRebTable.DEFREB_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.AssistTable.ASSIST_TABLE_DELETION_QUERY);
db.execSQL(DatabaseContract.TurnoverTable.TURNOVER_TABLE_DELETION_QUERY);
onCreate(db);
}
}
所涉及的每个安装都是干净安装:卸载应用程序并安装它,因为它是新的
在API19(Sumsung Galaxy 3)上,onCreate()
中的DatabaseHelper
方法在应用启动时执行,请参阅相关日志:
09-19 14:31:17.255 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: DatabaseHelper() executed.
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: onCreate() executed.
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE performance_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, jersey_number TEXT, pt_3 INTEGER, pt_2 INTEGER, pt_1 INTEGER, steal INTEGER, offensive_reb INTEGER, defensive_reb INTEGER, turnover INTEGER, block INTEGER, faul INTEGER, technical_faul INTEGER, flagrant_faul INTEGER, performance_table_created_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE player_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, player_first_name TEXT, player_last_name TEXT, player_position INTEGER, player_height INTEGER, player_weight INTEGER, player_profile_created_time_stamp INTEGER, player_birthday INTEGER, player_nickname TEXT, player_icon_url TEXT, player_career_3pt_made INTEGER DEFAULT 0, player_career_3pt_missed INTEGER DEFAULT 0, player_career_3pt_rate REAL DEFAULT 0, player_career_2pt_made INTEGER DEFAULT 0, player_career_2pt_missed INTEGER DEFAULT 0, player_career_2pt_percentage REAL DEFAULT 0, player_career_1pt_made INTEGER DEFAULT 0, player_career_1pt_missed INTEGER DEFAULT 0, player_career_1pt_percentage REAL DEFAULT 0, player_career_blocks INTEGER DEFAULT 0, player_career_steals INTEGER DEFAULT 0, player_career_assists INTEGER DEFAULT 0, player_career_turnovers INTEGER DEFAULT 0, player_career_total_games_played INTEGER DEFAULT 0, player_career_total_teams_joined INTEGER DEFAULT 0, player_career_total_personal_fauls INTEGER DEFAULT 0, player_career_total_flagrant_fauls INTEGER DEFAULT 0, player_career_total_technical_fauls INTEGER DEFAULT 0)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE team_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, team_uuid BLOB, team_name TEXT, player_jersey_number_team INTEGER, team_created_time_stamp INTEGER, player_uuid_team BLOB, UNIQUE(player_jersey_number_team, player_uuid_team))
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE pt_3_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, pt3_shot INTEGER, pt3_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE pt_2_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, pt2_shot INTEGER, pt2_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE pt_1_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, pt1_shot INTEGER, pt1_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE steal_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, steal_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE block_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, block_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE off_reb_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, off_reb_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE def_reb_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, def_reb_timestamp INTEGER)
09-19 14:31:17.355 5727-5727/com.leontheprofessional.bballscoreboard V/DatabaseHelper: CREATE TABLE assist_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, player_uuid BLOB, game_uuid BLOB, team_uuid BLOB, assist_timestamp INTEGER)
但是,在Google Nexus 6P上,即使执行或创建onCreate()
,也未执行DatabaseHelper
方法。请参阅相关日志:
09-19 14:59:14.178 15504-15504/com.leontheprofessional.bballscoreboard V/DatabaseHelper: DatabaseHelper() executed.
这里只有一条线。
更奇怪的是:
从Nexus6P获取db文件后,我发现这些表是先前设计的:只有3个在那里,并且列比当前列少得多。当我尝试通过player
将ContentProvider
对象插入数据库时,我收到SQLiteException
错误说"没有这样的列..."
卸载之前的应用程序后,每个安装都是干净。
卸载后,我尝试备份此应用程序的数据(使用package.name)以查看是否仍然保留了数据库残留,但是生成的back_up_data.ab
文件中没有一个项目。
我尝试在Nexus6P上运行命令adb uninstall <yourpackagename>
,但它是一样的:一旦安装了应用程序,保留了以前版本的数据库,onCreate()方法永远不会被执行。
出了什么问题?