我已经在StackOverflow和web上搜索了这个问题的答案,但我找不到答案。当我在姜饼上运行我的应用程序时,它运行得很好。但是当我在4.2.2上运行它时,我会得到这样的错误:java.lang.IllegalStateException无法执行此操作,因为连接池已经关闭
我有一个包含两个片段的SherlockFragmentActivity。
片段1:
public final class TodoFragment extends SherlockListFragment {
NotesDbAdapter db;
private static final int DELETE_ID = Menu.FIRST + 1;
public static TodoFragment newInstance(String s) {
TodoFragment fragment = new TodoFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new NotesDbAdapter(getActivity());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
return ll;
}
public final class NotesFragment extends SherlockListFragment {
NotesDbAdapter db;
private static final int ACTIVITY_EDIT = 1;
private static final int DELETE_ID = Menu.FIRST + 1;
public static NotesFragment newInstance(String content) {
NotesFragment fragment = new NotesFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new NotesDbAdapter(getActivity());
db.open();
if (db.fetchAllNotes().getCount() == 0) {
doWelcomeMessage();
}
db.close();
}
private void doWelcomeMessage() {
// Show welcome dialog
startActivity(new Intent(getActivity(), NotesWelcome.class));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
db = new NotesDbAdapter(getActivity());
db.open();
if (db.fetchAllNotes().getCount() == 0) {
doWelcomeMessage();
}
db.close();
return ll;
}
SherlockFragmentActivity:
public class NotesFragmentActivity extends SherlockFragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText("Notes"), NotesFragment.class,
null);
mTabsAdapter.addTab(bar.newTab().setText("Todo List"),
TodoFragment.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(),
info.args);
}
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
public void onPageScrollStateChanged(int state) {
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
我已经被困在这个问题上几个小时了(没有笑话),真的很感激任何帮助。再次感谢。
SQLiteConnectionPooling是在Android4.1之后添加的。在以前的版本中,如果对关闭的连接进行查询或其他操作,游标对象只会尝试重新打开数据库,而使用连接池,则会引发异常。NotesDBAdapter可能是一个倒退,它可能破坏了与4.2.2的兼容性。
我试着用谷歌搜索了很多个小时,但没有结果。请帮我把它修好。任何帮助都将不胜感激。谢谢!
我不明白为什么如果我之前调用,错误会说数据库是关闭的。请支持!谢谢:)
我使用了SQLiteDataBaseHelper类,其getInstance方法更改为synchronize. 作为此答案,但仍然存在问题not fixed。
问题内容: 我正在阅读有关此问题,但仍然没有找到解决方案。我注意到有时,我的应用会引发此错误: 我有一个使用此方法的文件,以获取其实例: 然后,我有类似这样的方法(它在发生该错误的行中崩溃)。它几乎从不崩溃,但有时会崩溃。 就这样,在我使用的所有方法中: 然后关闭游标和数据库。在这种情况下,该错误被抛出该行: 我不明白为什么如果我之前打电话,错误提示数据库已关闭。请支持!谢谢 :) 问题答案: 去
我通过play framework和mariadb客户端使用hikari pool connection,由于我定期更新它们(play 2.6.5->2.6.6和mariadb 2.1.1->2.1.2,但不确定是否相关),我出现了以下错误: 我在这里发现了一个相关的问题,并试图将idleTimeout和maxLifetime更改为2分钟和5分钟,但错误仍然发生。 我使用的是HikariCP 2.