根据我的 cmets。我确定我遇到了同样的问题,但我随后在this.getWriteableDatabase(); 添加了一个断点并进行了调试。然后,我尝试在
处进入代码(提出警告,但仍然
Sources for Android API 26 Platform not found)
public SQLiteDatabase getWritableDatabase() {
throw new RuntimeException("Stub!");
}
但此后一直有效。因此,我建议尝试做同样的事情(也许尝试清理并重建)。
我的代码(如下)与发布的代码非常相似,但我编写了表创建代码并添加了一些日志记录。记录的结果非常确认如下:-
10-20 21:12:48.879 24448-24448/? D/TESTDB: getTestDatabase invoked
10-20 21:12:48.879 24448-24448/? D/TESTDB: Calling Constructor from singleton
10-20 21:12:48.879 24448-24448/? D/TESTDB: Constructor Invoked
10-20 21:18:30.177 29719-29719/? D/TESTDB: getTestDatabase invoked
10-20 21:18:30.177 29719-29719/? D/TESTDB: Calling Constructor from singleton
10-20 21:18:30.177 29719-29719/? D/TESTDB: Constructor Invoked
10-20 21:18:44.181 29792-29792/? D/TESTDB: getTestDatabase invoked
10-20 21:18:44.181 29792-29792/? D/TESTDB: Calling Constructor from singleton
10-20 21:18:44.181 29792-29792/? D/TESTDB: Constructor Invoked
注意从这里开始,相同的代码开始工作并调用 onCreate????
10-20 21:21:29.644 31659-31659/? D/TESTDB: getTestDatabase invoked
10-20 21:21:29.644 31659-31659/? D/TESTDB: Calling Constructor from singleton
10-20 21:21:29.644 31659-31659/? D/TESTDB: Constructor Invoked
10-20 21:21:29.666 31659-31659/? D/TESTDB: Oncreate Invoked
10-20 21:25:38.967 1069-1069/? D/TESTDB: getTestDatabase invoked
10-20 21:25:38.967 1069-1069/? D/TESTDB: Calling Constructor from singleton
10-20 21:25:38.967 1069-1069/? D/TESTDB: Constructor Invoked
10-20 21:26:06.221 1069-1069/? D/TESTDB: Oncreate Invoked
10-20 21:28:38.297 3941-3941/? D/TESTDB: getTestDatabase invoked
10-20 21:28:38.297 3941-3941/? D/TESTDB: Calling Constructor from singleton
10-20 21:28:38.297 3941-3941/? D/TESTDB: Constructor Invoked
10-20 21:28:44.602 4040-4040/? D/TESTDB: getTestDatabase invoked
10-20 21:28:44.602 4040-4040/? D/TESTDB: Calling Constructor from singleton
10-20 21:28:44.602 4040-4040/? D/TESTDB: Constructor Invoked
10-20 21:34:39.608 9786-9786/? D/TESTDB: getTestDatabase invoked
10-20 21:34:39.608 9786-9786/? D/TESTDB: Calling Constructor from singleton
10-20 21:34:39.608 9786-9786/? D/TESTDB: Constructor Invoked
10-20 21:36:48.139 10495-10495/? D/TESTDB: getTestDatabase invoked
10-20 21:36:48.139 10495-10495/? D/TESTDB: Calling Constructor from singleton
10-20 21:36:48.139 10495-10495/? D/TESTDB: Constructor Invoked
10-20 21:36:48.188 10495-10495/? D/TESTDB: Oncreate Invoked
注意!我没有删除上述多次运行的数据库(我最后一次运行)。
在调用 onUpgrade 时将版本更改为 102
10-20 21:41:49.007 15098-15098/? D/TESTDB: getTestDatabase invoked
10-20 21:41:49.007 15098-15098/? D/TESTDB: Calling Constructor from singleton
10-20 21:41:49.007 15098-15098/? D/TESTDB: Constructor Invoked
10-20 21:41:49.011 15098-15098/? D/TESTDB: onUpgrade invoked
我使用的代码(请原谅明目张胆的抄袭 :))哦,现在的版本是 102(最初使用的是 101):-
public class TestDatabase extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 102;
private static final String DATABASE_NAME = "dbName.db";
//Singleton
private static TestDatabase testDatabase = null;
public static TestDatabase getTestDatabase(Context context) {
Log.d("TESTDB","getTestDatabase invoked");
if (testDatabase == null) {
Log.d("TESTDB", "Calling Constructor from singleton");
testDatabase = new TestDatabase(context);
}
return testDatabase;
}
private TestDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.d("TESTDB","Constructor Invoked");
this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("TESTDB","Oncreate Invoked");
String tblcrt = "CREATE TABLE IF NOT EXISTS testtable (" +
"_id INTEGER PRIMARY KEY," +
"COL1 TEXT" +
")";
db.execSQL(tblcrt);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.d("TESTDB","onUpgrade invoked");
}
}
还有:-
......
TestDatabase testdb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViewIDs();
setDBViewerButton(mButton1); // setup Button 1 for DBViewer
testdb = TestDatabase.getTestDatabase(this);
.....
}