我正在尝试从我的SQLiteOpenHelper类中调用内容提供程序中的updateDatabase()方法,因此我只会在版本更改时升级数据库,而不是每次应用程序编译时都升级。这意味着我必须将updateDatabase()放在onCreate()或onUpgrade()中,但它不会识别updateDatabase()方法。我在Android上不够流利,不知道该怎么做,有人可以帮帮我吗?
如果我从SQLiteOpenHelper中删除static关键字并将updateDatabase()放在SQLiteOpenHelper的onCreate()中,那么我的应用程序会立即打开和关闭。然后我得到这个错误:无法分配24384046字节分配4194304空闲字节和15MB直到OOM。
基本上我在SQLiteOpenHelper之外有一个更新方法,我需要onUpgrade()来访问外部方法updateDataBase()。
下面是我实际拥有的简化代码,我只需要说明问题(可能有额外的花括号):
public class PeriodicTable extends ContentProvider {
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_DB_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + ELEMENTS_TABLE_NAME);
//I want to call updateDatabase() here
//so I can update database not every time I compile
onCreate(db);
}
}
public void updateDatabase(){
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
if(db != null){
try {
XmlPullParserHandler parser = new XmlPullParserHandler();
InputStream is = context.getAssets().open("elements.xml");
elements = parser.parse(is);
} catch (IOException e) {e.printStackTrace();}
try{
ArrayList<ContentProviderOperation> operations = new ArrayList<>();
db.beginTransaction();
for(int i=0; i<elements.size(); i++){
ContentValues v = new ContentValues();
Element current = elements.get(i);
v.put(ATOMIC_NUMBER, current.getAtomicNumber());
v.put(SYMBOL, current.getSymbol());
v.put(NAME, current.getName());
v.put(MOLAR_MASS, current.getMolarMass());
operations.add(ContentProviderOperation.newInsert(CONTENT_URI).withValues(v).build());
}
db.setTransactionSuccessful();
applyBatch(operations);
}catch (final OperationApplicationException e1){
}
finally {
db.endTransaction();
}
}
}
}
}
修改 我实际上通过在我的内容提供程序中使用下面的onCreate()方法解决了这个问题,但我仍然想知道你是否可以使用onUpgrade()或onCreate()从SQLiteOpenHelper类中访问updateDatabase:
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
Cursor c = query(CONTENT_URI, null, null, null, PeriodicTable.ATOMIC_NUMBER);
if(!c.moveToFirst()){
updateDatabase();
}
return (db == null)? false:true;
}