service是必须通过UI组件触发来启动的,不能自启动,因此必须有上下文context,同时SQLiteOpenHelper类作为后台数据获取,获取后必然会对UI界面进行填充或者对UI界面进行一些显示之类的操作,没有context的话如何使两者联系起来达到数据交换和控制的目的?关于异常的错误,推测有两种可能:
1、如果是自己创建的数据库,可能数据库创建不成功,进DDMS里面用命令行直接访问下数据库看看是否能够正常访问。
2、如果用系统自带的联系人数据库的话,必须用uri的方式访问-----个人愚见

解决方案 »

  1.   

    进DDMS后进入与你项目包名对应的目录下面,里面有个data文件夹,假设里面数据库文件叫abc.db,就在命令行里面输入sqlite3 abc.db就可以进入到sqlite命令行下面了,接下来可以用.tables;查看所有表,查询的语句跟SQLSERVER一样的。
    PS:你的Service在没有context的情况下是怎么控制跟UI交互?另外检查一下AndroidManifest.xml里面有没有配置对应的<service>节点
      

  2.   

    不过这里用到了context,这里的context又是什么??
    bootreceiverpublic class MyBootReceiver extends BroadcastReceiver {
    MyListenerService mListenerService;
    String tag = "BlackListActivity";
    @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    Log.i(tag, "MyBootReceiver boot up receiver" );  

    //for listener of call, start a service
    Intent intent1 = new Intent(context, MyListenerService.class);
    Log.i(tag, "MyBootReceiver before startService");
    context.startService(intent1);
    Log.i(tag, "MyBootReceiver after startService"); }
    }
      

  3.   

    呵呵,必须配了
    <receiver android:name="com.techfaith.blacklist.MyBootReceiver">
         <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
         <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter>
    </receiver>
                
    <service android:name="com.techfaith.blacklist.MyListenerService" 
                  android:enabled="true">         
    </service>
      

  4.   

    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. SDK的解释:一个应用环境中的全局信息接口,是被android系统执行的一个抽象类,它可以操作应用程序中的资源和类,同时也在应用层操作类似启动Activity,broadcast和接收intent信息等。至于具体在项目里面的作用,这个还真的靠自己理解。
      

  5.   


    那这就是报空指针的原因了,把DatabaseHelper的代码贴出来看看把
      

  6.   

    可是我明明还在用模拟器操作~public class MyDataBaseAdapter {
    private static final String tag = "BlackListActivity";
    public static final String KEY_ID = "_id";
    public static final String KEY_NUM = "num";
    private static final String DB_NAME = "Blacklist.db";
    private static final String DB_TABLE = "NumberList";
    private static final int DB_VERSION = 1;
    private Context mContext = null;
    private static final String DB_CREATE = "CREATE TABLE "
    + DB_TABLE + " ("
    + KEY_ID + " INTEGER PRIMARY KEY,"
    + KEY_NUM + " TEXT)";
    SQLiteDatabase mSQLiteDatabase = null;
    DatabaseHelper mDatabaseHelper = null;

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
    DatabaseHelper(Context context)
    {
    super(context, DB_NAME, null, DB_VERSION);
    Log.i(tag, "DatabaseHelper");
    }

    public void onCreate(SQLiteDatabase db)
    {
    Log.i(tag, "Before DB_CREATE");
    db.execSQL(DB_CREATE);
    Log.i(tag, "DB_CREATE");
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
    db.execSQL("DROP TABLE IF EXISTS "+DB_TABLE);
    Log.i(tag, "onUpgrade");
    onCreate(db);
    }
    }

    public MyDataBaseAdapter(Context context)
    {
    mSQLiteDatabase = null;
    mDatabaseHelper = null;
    mContext = context;
    Log.i(tag, "MyDataBaseAdapter");
    }

    public void open() throws SQLException
    {
    Log.i(tag, "MyDataBaseAdapter open()");
    mDatabaseHelper = new DatabaseHelper(mContext);
    mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();
    }

    public void onlyReadOpen() throws SQLException
    {
    Log.i(tag, "MyDataBaseAdapter onlyReadOpen()");
    mDatabaseHelper = new DatabaseHelper(mContext);
    mSQLiteDatabase = mDatabaseHelper.getReadableDatabase();
    }

    public void close()
    {
    Log.i(tag, "MyDataBaseAdapter close()");
    mDatabaseHelper.close();
    mSQLiteDatabase.close();
    }

    public long insertData(String number)
    {
    Log.i(tag, "MyDataBaseAdapter insertData()"+number);
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NUM, number);
    return mSQLiteDatabase.insert(DB_TABLE, KEY_ID, initialValues);
    }

    public boolean deleteData(long rowId)
    {
    Log.i(tag, "MyDataBaseAdapter deleteData()");
    return mSQLiteDatabase.delete(DB_TABLE,KEY_ID + "=" +rowId, null) > 0;
    }

    public boolean deleteDatabyString(String num)
    {
    Log.i(tag, "MyDataBaseAdapter deleteData()"+num);
    return mSQLiteDatabase.delete(DB_TABLE,KEY_NUM + "=\"" +num+"\"", null) > 0;
    }

    public Cursor fetchAllData()
    {
    Log.i(tag, "MyDataBaseAdapter fetchAllData()");
    return mSQLiteDatabase.query(DB_TABLE, new String[]{ KEY_ID, KEY_NUM},
    null,null,null,null,null);
    }

    public Cursor fecthData(long rowId) throws SQLException
    {
    Log.i(tag, "MyDataBaseAdapter fetchData()");
    Cursor mCursor = 
    mSQLiteDatabase.query(true, DB_TABLE, new String[]{KEY_ID, 
    KEY_NUM}, KEY_ID+"="+rowId, null, null, null,null,null);
    if(mCursor != null)
    {
    mCursor.moveToFirst();
    }
    return mCursor;
    }

    public boolean updateData(long rowId, String number)
    {
    Log.i(tag, "MyDataBaseAdapter updateData()");
    ContentValues args = new ContentValues();
    args.put(KEY_NUM, number);
    return mSQLiteDatabase.update(DB_TABLE, args, KEY_ID+"="+rowId, null) > 0;
    }
    }
      

  7.   


    下了个SQLiteSpy,原来需要先把数据库导到本地才行~~ 数据库里面的数据是正确的
      

  8.   

    下去的好快,问题精简下,如何在不启动acivity的情况下连接sqlite数据库?
    使用getWritableDatabase的时候总是得到空指针...
      

  9.   

    楼主啊,我问下,你那个是怎么实现的,在service中操作数据库,我这,也出现的是close()没有关闭,这是怎么回事儿啊?