当前位置: 代码迷 >> Android >> Service访问数据库出错,异常为空指针
  详细解决方案

Service访问数据库出错,异常为空指针

热度:28   发布时间:2016-05-01 17:51:42.0
Service访问数据库出错,错误为空指针
各位大虾同志
再做一个类似于黑名单的小应用,自学成才,思路是这样,MyBootReceiver类设置开机启动MyListenerService中的服务,该服务所做的操作就是监听MyPhoneListener类里面的onCallStateChanged,若来电,则判断是否是存在SQLite里面的电话号码,目前错在这里
来电时,进行号码判断,去读数据库然后遍历看是否与数据库号码相同,读数据库的时候出错

代码
Java code
    public boolean judgeincomingcall(String incomingNumber){        Log.i(tag, "MyPhoneListener incoming call is "+ incomingNumber);        mBlackListActivity = new BlackListActivity();                MyDataBaseAdapter mMyDataBaseAdapter = new MyDataBaseAdapter(mBlackListActivity);        mMyDataBaseAdapter.onlyReadOpen();...}

onlyReadOpen:
Java code
    public void onlyReadOpen() throws SQLException    {        Log.i(tag, "MyDataBaseAdapter onlyReadOpen()");        mDatabaseHelper = new DatabaseHelper(mContext);        mSQLiteDatabase = mDatabaseHelper.getReadableDatabase(); // 这里出错    }


我想请教的是,这里面的Context的作用是什么?因为是后台运行的服务,所以运行时没有Activity,只有在设置添加黑名单号码的时候才会打开BlackListActivity这个页面,并且设置的时候读取数据库是正常的!

出错Log:
11-15 05:57:32.710: E/AndroidRuntime(367): java.lang.NullPointerException
11-15 05:57:32.710: E/AndroidRuntime(367): at android.content.ContextWrapper.openOrCreateDatabase(SourceFile:234)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SourceFile:149)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SourceFile:218)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyDataBaseAdapter.onlyReadOpen(MyDataBaseAdapter.java:67)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyPhoneListener.judgeincomingcall(MyPhoneListener.java:43)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.techfaith.blacklist.MyPhoneListener.onCallStateChanged(MyPhoneListener.java:27)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.telephony.PhoneStateListener$2.handleMessage(SourceFile:356)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.os.Handler.dispatchMessage(SourceFile:130)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.os.Looper.loop(SourceFile:351)
11-15 05:57:32.710: E/AndroidRuntime(367): at android.app.ActivityThread.main(SourceFile:3814)
11-15 05:57:32.710: E/AndroidRuntime(367): at java.lang.reflect.Method.invokeNative(Native Method)
11-15 05:57:32.710: E/AndroidRuntime(367): at java.lang.reflect.Method.invoke(Method.java:538)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(SourceFile:901)
11-15 05:57:32.710: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit.main(SourceFile:659)
11-15 05:57:32.710: E/AndroidRuntime(367): at dalvik.system.NativeStart.main(Native Method)


十分感谢!

------解决方案--------------------
service是必须通过UI组件触发来启动的,不能自启动,因此必须有上下文context,同时SQLiteOpenHelper类作为后台数据获取,获取后必然会对UI界面进行填充或者对UI界面进行一些显示之类的操作,没有context的话如何使两者联系起来达到数据交换和控制的目的?

关于异常的错误,推测有两种可能:
1、如果是自己创建的数据库,可能数据库创建不成功,进DDMS里面用命令行直接访问下数据库看看是否能够正常访问。
2、如果用系统自带的联系人数据库的话,必须用uri的方式访问

-----个人愚见
------解决方案--------------------
进DDMS后进入与你项目包名对应的目录下面,里面有个data文件夹,假设里面数据库文件叫abc.db,就在命令行里面输入sqlite3 abc.db就可以进入到sqlite命令行下面了,接下来可以用.tables;查看所有表,查询的语句跟SQLSERVER一样的。
PS:你的Service在没有context的情况下是怎么控制跟UI交互?另外检查一下AndroidManifest.xml里面有没有配置对应的<service>节点
------解决方案--------------------
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc. 
  相关解决方案