Android:试图在SQLiteOpenHelper之外调用方法

时间:2015-11-27 19:05:47

标签: java android database sqlite

我正在尝试从我的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;
}

0 个答案:

没有答案