service是必须通过UI组件触发来启动的,不能自启动,因此必须有上下文context,同时SQLiteOpenHelper类作为后台数据获取,获取后必然会对UI界面进行填充或者对UI界面进行一些显示之类的操作,没有context的话如何使两者联系起来达到数据交换和控制的目的?关于异常的错误,推测有两种可能:
1、如果是自己创建的数据库,可能数据库创建不成功,进DDMS里面用命令行直接访问下数据库看看是否能够正常访问。
2、如果用系统自带的联系人数据库的话,必须用uri的方式访问-----个人愚见
1、如果是自己创建的数据库,可能数据库创建不成功,进DDMS里面用命令行直接访问下数据库看看是否能够正常访问。
2、如果用系统自带的联系人数据库的话,必须用uri的方式访问-----个人愚见
解决方案 »
- vlc-android 缓冲问题
- android + linux下的二个问题
- android的jar包的问题.
- 怎样让电脑和android手机用数据线进行通信
- 紧急求助,在线等答案!如何实现类似于超级玛丽中的,主人公在行走,但相对屏幕位置不变。。
- 点击一个ImageView让它至于控件的最前面
- android加入权限的问题
- Android radiogroup问题
- 求教一个手指画图程序,实在想不出哪里错了。
- Android 通过Linux获取手机的IMSI号码
- 求助:Android4.0.4设备用ADB检测一直处于Offline状态
- android下phonegap的navigator.network为空??
PS:你的Service在没有context的情况下是怎么控制跟UI交互?另外检查一下AndroidManifest.xml里面有没有配置对应的<service>节点
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"); }
}
<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>
那这就是报空指针的原因了,把DatabaseHelper的代码贴出来看看把
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;
}
}
下了个SQLiteSpy,原来需要先把数据库导到本地才行~~ 数据库里面的数据是正确的
使用getWritableDatabase的时候总是得到空指针...