2013-01-10 26 views
0

我可以从我的活动访问数据库功能,它工作正常。但是,当我使用相同的广播接收器类失败,并给了我光标的默认值,而我的logcat表明这一点:无法从广播接收器类访问数据库android

接近()从未被明确要求在数据库 DatabaseObjectNotCloseException

我也做

db = context.openOrCreateDatabase("blitz.db", 0, null);  
dh=new DataHelper(context); 

,并通过onReceiver方法的背景下DataHelper类。 它显示在此行

OpenHelper openhelper=new OpenHelper(this.context); 
this.db=openhelper.getWritableDatabase(); 

请让我知道我错了

+1

close()从未在数据库上显式调用过DatabaseObjectNotCloseException表示您在某些活动类中首次创建数据库对象后未关闭数据库对象。调用db。关闭()在那第一 –

+0

我已经这样做,但问题仍然存在 –

+0

检查我的答案 – GoCrazy

回答

0

始终关闭数据库,当你完成了你的数据库的工作,

为简单起见,在你的数据库处理器类中创建下面的方法,

public void Open_DB(SQLiteDatabase db){ 
    return this.getWritableDatabase(); 
    } 

public void Close_DB(SQLiteDatabase db){ 
    db.close(); 
    } 

并使用您的活动或服务,因为这方法,

OpenHelper openhelper=new OpenHelper(getApplicationContext()); 
SQLiteDatabase db=openhelper.Open_DB(db) 
openhelper.some_Operation(db); 
db.Close_DB(db); 

或者您可以在单个mehod(它位于数据库处理程序类中)中打开和关闭数据库,如

public void deleteRecord(String id) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_REMINDER, REMINDER_ID + " = ?", 
       new String[] { String.valueOf(id)}); 
     db.close(); 
    } 

,并呼吁从为您的活动这种方法,

public void Delete_A_Reminder(String id){ 
    DatabaseHandler mydb=new DatabaseHandler1(getApplicationContext()); 
    mydb.deleteRcord(id); 
} 

在一般情况下,如果u想打开你家的窗口,它已经在那之前打开,你必须关闭并重新打开,如果你的数据库已经打开,并且你想再次打开它,那么你必须先关闭它,这样你才能再次打开它。

-1

广播接收器监听在不同的线程到不同的加工误差。沟通你需要使用异步方法。我最好的办法是注册一个处理程序,并使用捆绑[在意图]沟通。

1

请记住,BroadcastReceiver在主线程上运行,的最大寿命为10秒,因此您不应该在onReceive(...)中执行任何长时间运行的任何操作。

相反,您应该启动一个服务来在工作线程上执行长时间运行的工作。我建议看看IntentService

+0

感谢rply,我会尝试和实施IntentService但如果你有一些好的链接,那么请发布它。 –

+0

Android培训网站有关于服务的全面部分:http://developer.android.com/guide/components/services.html –

0

覆盖OnStop()和关闭有

@Override 
public void OnStop() 
{ 
    if(db!=null) 
    { 
    db.close(); 
    } 
} 

应该摆脱你的错误了。