1

我正在开发一个应用程序并使用SQLite,contentResolver和contentProvider。使用ContentProvider升级Android中的SQLite数据库

应用程序描述 我的应用程序搜索内部SQLite数据库中的联系人。数据从第一次午餐时选择的外部文件或当用户按下菜单中的更新选项时到达。

使用getContentResolver()完成对数据库的所有访问。

的ContentProvider 我有一个ContactsContentProvider类,它扩展的ContentProvider并持有至ContactsDBAdapter这是一个扩展SQLiteOpenHelper我的数据库适配器的参考。 (我希望你到现在都和我在一起)。

问题描述 当用户按下更新按钮我希望DB删除所有表和加载新的数据(这是由我的文件选择做伟大工程)。在我ContactsDBAdapter为了使onUpgrade()工作内容提供商的onCreate() 必须具有更高的版本被称为又算得了什么呢

@Override 
public boolean onCreate() { 
     context = getContext(); 
     pref = PreferenceManager.getDefaultSharedPreferences(context); 
     int dbVersion = pref.getInt(Settings.DB_VERSION, 1); 
     mDb = new ContactsDBAdapter(context,dbVersion); 
     return (mDb == null)? false : true; 
} 

有过,但我得到了ContentProvider的从我的contentResolver所以它不会创建两次。

虽然有很多的如何使用这两种的ContentProviderContentResolver的我没有找到任何地方一个很好的升级进步的解释。

我知道的onUpgrade是如何工作的,它被在getReadableDatabase()getWritableDatabase()调用检查,但事实是,版本将不会被diferent因为ContactsDBAdapter是与之前相同的实例。

我想到了一些解决方法,但根本不喜欢它们。 我可以在insert()期间手动检查版本是否更高(但由于每次调用都会完成,这会很昂贵),并且如果答案为真,则手动调用onUpgrade。

或尝试以某种方式取消注册提供程序,但目前为止尚未找到任何有效且良好的解决方案。

升级数据库的最佳做法是什么?

谢谢!

回答

0

我找到了一个很好的解决方案。 在我ContactsContentProvider延伸的ContentProvider我加了一个sharedPrefencesListener

@Override 
public boolean onCreate() { 
     context = getContext(); 
     pref = PreferenceManager.getDefaultSharedPreferences(context); 
     int dbVersion = pref.getInt(Settings.DB_VERSION, 1); 
     mDb = new ContactsDBAdapter(context,dbVersion); 
     pref.registerOnSharedPreferenceChangeListener(sharedPrefListener) ; 
     return (mDb == null)? false : true; 
} 
SharedPreferences.OnSharedPreferenceChangeListener sharedPrefListener = 
    new SharedPreferences.OnSharedPreferenceChangeListener() { 

    @Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
    String key) { 
    if(key.equals(Settings.DB_VERSION)){ 
    int dbVersion = sharedPreferences.getInt(Settings.DB_VERSION, 1); 
    synchronized (mDb) { 
      mDb.close();//Not sure this is the right behavior 
     mDb = new ContactsDBAdapter(context,dbVersion); 
    } 
    } 
} 
}; 

现在,当用户在我的主要活动改变了版本号,然后我设置了版本号。这将调用一个新的ContactsDBAdapter,然后在下次有人需要getReadableDatabase()或getWriteableDatabase()时调用onUpgrade。

1

我建议您更新共享偏好改变数据库的版本,并将其添加:

SharedPreferences.Editor ed = pref.edit(); 
ed.putInt(Settings.DB_VERSION, dbVersion + 1); 
ed.commit(); 

希望它可以帮助你

+0

这当用户如你CAC看到这里点击更新按钮完成: \t公共无效的onClick(DialogInterface对话,诠释其){// \t \t \t \t \t \t \t dialog.dismiss(); \t \t \t \t \t \t \t int newVersion = preferences.getInt(Settings.DB_VERSION,1)+ 1; \t \t \t \t \t \t \t Editor editor = preferences.edit(); \t \t \t \t \t \t \t editor.putInt(Settings.DB_VERSION,newVersion); (“更新”,“更新数据库版本为版本:”+ newVersion);以及更新版本。 \t \t \t \t \t \t \t editor.commit(); \t \t \t \t \t \t \t \t \t \t \t \t \t lunchFileChooser(); \t \t \t \t \t \t} – Ika 2012-04-21 22:06:14

+0

嗨文斯。我不确定我的回复是否被正确理解。你的建议是当我想更新数据库时更新版本(下一次调用getReadableDatabase),但这会**不会发生(因为它正是我所做的),这是由于onCreate每次调用都不会调用contentResolver,因此不会更新数据库版本。 – Ika 2012-04-22 16:44:20