从Android服务中打开数据库连接时出错

时间:2012-09-14 23:51:10

标签: android sqlite android-service runtime-error

我必须从Service android调用一个打开与内部android数据库(sqlite)连接的方法。我正在使用以下代码:

public class myService extends Service{

public void setDB(DB_DatabaseManager db){
    dbManager = db;
}

public DB_DatabaseManager dbManager;
private Timer timer; 

public IBinder onBind(Intent intent){
    return null;
}

public void onCreate(){
    super.onCreate();
    Log.i("my attempt","service activated");
    TimerTask task = new TimerTask(){
        public void run(){
            Log.i("my attempt","ANDROID SERVICE RUNNING!");
            dbManager.open(); // <--this statement generates error!
                            // --- in this section I start the communication with database

        }

    };
    timer = new Timer();
    timer.schedule(task, 0, 20000);
}

public void onDestroy(){
    super.onDestroy();
    timer.cancel();
    timer = null;
    Log.i("my attampt", "service stopped");
}

open()定义为:

    SQLiteDatabase mDb=mDbHelper.getWritableDatabase();

为了调用我使用的服务:

    myService serv = new myService();
    serv.setDB(dbManager); 
    startService(new Intent(this,myService.class));

如果删除行dbManager.open(),则一切正常; 但是我的coode的其他部分中的方法dbManager.open()运行良好。但在这种情况下,我在logcat中获得以下错误:

   09-14 23:44:32.287: E/AndroidRuntime(1115): FATAL EXCEPTION: Timer-0
   09-14 23:44:32.287: E/AndroidRuntime(1115): java.lang.NullPointerException
   09-14 23:44:32.287: E/AndroidRuntime(1115):  at host.framework.myService$1.run(myService.java:49)
   09-14 23:44:32.287: E/AndroidRuntime(1115):  at java.util.Timer$TimerImpl.run(Timer.java:284)

1 个答案:

答案 0 :(得分:2)

不要试图这样做......

myService serv = new myService();

Activity类相似,Service是一个“特殊情况”类,您绝不应尝试使用new创建实例。

使用ServicebindService(...)创建startService(...),操作系统负责创建/实例化它。

在您的情况下,您似乎需要Service能够访问数据库“帮助程序”类,并且您可以通过多种方式执行此操作。

一种方法是扩展Application类,并让它创建db帮助程序的实例并保留static对它的引用。这样在Service中,你可以简单地使用......

MyApp.mDbHelper.open();

或者使用{heller]的singleton模型,这样你就可以在Service中执行以下操作......

DB_DatabaseManager.getInstance().open();