Sam*_*mer 2 sqlite service android
当试图通过正常机制打开数据库连接时,nullpointerexecption会抛出一个点dbhelper.getWritableDatabase.
问题似乎源于IntentService我传递的背景.
public AnalysisService() {
super("AnalysisService");
Log.d("ANALYSIS_SERVICE", "Service started");
try{
db = new DBAdapter(this)
db.openDB();
}catch(Exception e){
Log.d("ANALYSIS_SERVICE", Arrays.toString(e.getStackTrace()));
Log.e("ANALYSIS_SERVICE", e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
该db.open方法在这里执行:
public class DBAdapter implements Database {
protected Context context;
protected SQLiteDatabase db;
private DatabaseHelper dbHelper;
public DBAdapter(Context context) {
this.context = context;
Log.e("DB_ADAPTER", "CREATED");
}
/**
* Opens a database connection.
* @return
* @throws SQLException
*/
@Override
public DBAdapter openDB() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase(); //NULLP EXCEPTION THROWN HERE
return this;
}
Run Code Online (Sandbox Code Playgroud)
如果它有助于构造函数dbHelper是:
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.e("DB_HELPER", "created");
}
Run Code Online (Sandbox Code Playgroud)
在最后一天左右这让我感到困惑,我无法理解为什么上下文无效.此外,我已记录所有构造函数并正确创建所有对象,因此DBHelper不是null.
除了使用上下文之外,我还尝试使用getBaseContext()和getApplicationContext(),两者都导致相同的错误.
从调试打印堆栈跟踪,我得到:
11-21 13:23:45.419: D/ANALYSIS_SERVICE(3930):
[android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221),
android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:166),
com.emotifi.database.DBAdapter.openDB(DBAdapter.java:42),
com.emotifi.analysis.AnalysisService.<init>(AnalysisService.java:45),
java.lang.Class.newInstanceImpl(Native Method),
java.lang.Class.newInstance(Class.java:1319),
android.app.ActivityThread.handleCreateService(ActivityThread.java:2234),
android.app.ActivityThread.access$1600(ActivityThread.java:123),
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201),
android.os.Handler.dispatchMessage(Handler.java:99),
android.os.Looper.loop(Looper.java:137),
android.app.ActivityThread.main(ActivityThread.java:4424),
java.lang.reflect.Method.invokeNative(Native Method),
java.lang.reflect.Method.invoke(Method.java:511),
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817),
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584),
dalvik.system.NativeStart.main(Native Method)]
Run Code Online (Sandbox Code Playgroud)
您在IntentService生命周期中过早地设置了上下文.
覆盖onCreate并设置它:
@Override
public void onCreate() {
super.onCreate();
Log.d("ANALYSIS_SERVICE", "Service started");
db = DatabaseFactory.getDefault(this);
}
Run Code Online (Sandbox Code Playgroud)
然后打开数据库连接onHandleIntent:
@Override
protected void onHandleIntent(Intent intent) {
// Logging
Log.d("ANALYSIS_SERVICE", "Intent handled");
try {
db.openDB();
} catch (Exception e) {
Log.d("ANALYSIS_SERVICE", "Unable to open database");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2460 次 |
| 最近记录: |