为什么在android BroadcastReceiver中尝试打开sqlite数据库时出错?
我是android初学者,在主活动中调用alarm manager,在alarm manager中编写以下代码:为什么在android BroadcastReceiver中尝试打开sqlite数据库时出错?,android,Android,我是android初学者,在主活动中调用alarm manager,在alarm manager中编写以下代码: public class AlarmReciever extends BroadcastReceiver { private static Context myContext; @Override public void onReceive(Context context, Intent intent) { new HttpAsyncT
public class AlarmReciever extends BroadcastReceiver {
private static Context myContext;
@Override
public void onReceive(Context context, Intent intent) {
new HttpAsyncTask().execute("http://myHOST.ir/oflineValue.aspx");
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
try {
String DATABASE_NAME = "TEMPFOOD";
String TABLE_NAME = "tempData";
SQLiteDatabase db;
db=SQLiteDatabase.openOrCreateDatabase(DATABASE_NAME,myContext.MODE_PRIVATE, null);
}catch(Exception e)
{
}
}
@Override
protected void onPostExecute(String result) {
}
}
}
我得到这个错误:
为什么我会犯这个错误?答案在你的问题中-
尝试将null作为第二个参数。openOrCreateDatabase()的第二个参数必须是
SQLiteDatabase.CursorFactory
,这是可选的,默认情况下实例化任何游标都需要它。如果不想实例化,请使用值null
作为第二个参数
db=SQLiteDatabase.openOrCreateDatabase(DATABASE_NAME,myContext.MODE_PRIVATE, null);
如果要实例化,请尝试以下代码:-
db=SQLiteDatabase.openOrCreateDatabase(DATABASE_NAME,new SQLiteDatabase.CursorFactory() {
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
//Assign the values of masterQuery,query,editTable as per your requirements
return new SQLiteCursor(masterQuery,editTable,query);
}
}, null);
你的代码不可靠。一旦
onReceive()
返回,您的进程可能会在毫秒内终止,您的工作将无法完成。另外,在您的工作完成之前,设备可能会睡着。将代码从AsyncTask
移动到IntentService
及其onHandleIntent()方法中。然后,将您的BroadcastReceiver
更改为WakefulBroadcastReceiver
并。
db=SQLiteDatabase.openOrCreateDatabase(DATABASE_NAME,new SQLiteDatabase.CursorFactory() {
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
//Assign the values of masterQuery,query,editTable as per your requirements
return new SQLiteCursor(masterQuery,editTable,query);
}
}, null);