新手小白最近入手安卓开发,想在Service中写一个数据库来不断保存从网口读到的数据,但是在获取数据库对象的时候就遇到了空指针异常,求各位大神解惑~
首先是异常的Logcat:
然后是我的DataBaseHelper类
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "send.db";
private static final int DB_VERSION = 1; private static final String TABLE_SEND_CREATE = "create table sendtable(_id integer primary key autoincrement,msg varchar(100))";
private static final String TABLE_RECEIVE_CREATE = "create table receivetable(_id integer primary key autoincrement,destId integer," +
"srcId integer,msg varchar(255),time integer,priority integer,location varchar(255))"; private static SQLiteDatabase db;
private static DataBaseHelper DBHelper; public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} public DataBaseHelper(Context context, String name) {
this(context, DB_NAME, DB_VERSION);
DBHelper = new DataBaseHelper(context, DB_NAME, null, DB_VERSION);
} public DataBaseHelper(Context context, String name, int version) {
this(context, DB_NAME, null, DB_VERSION);
DBHelper = new DataBaseHelper(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(TABLE_SEND_CREATE);
db.execSQL(TABLE_RECEIVE_CREATE);
} @Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists sendtable");
db.execSQL("drop table if exists receivetable");
onCreate(db);
} public static void DBwriter(Context context,String data){
DataBaseHelper sendDBhelper = new DataBaseHelper(context,"send.db",null,1);
SQLiteDatabase db =sendDBhelper.getReadableDatabase();
ContentValues cv = new ContentValues();
cv.put("msg",data);
db.insert("sendtable",null,cv);
db.close();
} public static List<String> DBreader(Context context){
List<String> dataread = new ArrayList<String>();
DataBaseHelper sendDBhelper = new DataBaseHelper(context,"send.db",null,1);
SQLiteDatabase db =sendDBhelper.getReadableDatabase();
Cursor cursor = null;
cursor = db.query("sendtable",new String[]{"msg"},null,null,null,null,null);
while (cursor.moveToNext()){
dataread.add(cursor.getString(cursor.getColumnIndex("msg")));
}
if (cursor != null){
cursor.close();
}
return dataread;
}
}接下来是我的Service类public class UdpService extends Service { DataBaseHelper dataBaseHelper = new DataBaseHelper(this,"send.db");
SQLiteDatabase db = dataBaseHelper.getReadableDatabase(); int sendPort = 5005;
int receivePort = 5005; UdpRelay.PacketReceivedListener listener = new UdpRelay.PacketReceivedListener() {
@Override
public void onReceive(MyPacket packet) {
ContentValues cv = new ContentValues();
cv.put("msg",packet.getMessage());
cv.put("priority",packet.getPrioriry());
cv.put("srcId",packet.getSrcId());
cv.put("destId",packet.getDestId());
cv.put("time",packet.getTime());
cv.put("location",packet.getLocation());
//db.insert("receivetable",null,cv);
}
}; UdpRelay relay = new UdpRelay(sendPort, receivePort, listener);
/**
* 绑定服务时才会调用
* 必须要实现的方法
*/
@Nullable
@Override
public IBinder onBind(Intent intent){
return null;
} /**
* 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
* 如果服务已在运行,则不会调用此方法。该方法只被调用一次
*/
@Override
public void onCreate() {
super.onCreate();
Log.d("myservicecreate","create");
} /**
* 每次通过startService()方法启动Service时都会被回调。
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("myservicestart","start");
relay.start();
return super.onStartCommand(intent, flags, startId);
} /**
* 服务销毁时的回调
*/
@Override
public void onDestroy() {
//db.close();
super.onDestroy();
}
}
MainActiviy中关于启动Service的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main); //启动Service
Intent myudpservice = new Intent(this,UdpService.class);
startService(myudpservice);希望各位大神指点迷津,感激不尽
首先是异常的Logcat:
然后是我的DataBaseHelper类
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "send.db";
private static final int DB_VERSION = 1; private static final String TABLE_SEND_CREATE = "create table sendtable(_id integer primary key autoincrement,msg varchar(100))";
private static final String TABLE_RECEIVE_CREATE = "create table receivetable(_id integer primary key autoincrement,destId integer," +
"srcId integer,msg varchar(255),time integer,priority integer,location varchar(255))"; private static SQLiteDatabase db;
private static DataBaseHelper DBHelper; public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} public DataBaseHelper(Context context, String name) {
this(context, DB_NAME, DB_VERSION);
DBHelper = new DataBaseHelper(context, DB_NAME, null, DB_VERSION);
} public DataBaseHelper(Context context, String name, int version) {
this(context, DB_NAME, null, DB_VERSION);
DBHelper = new DataBaseHelper(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(TABLE_SEND_CREATE);
db.execSQL(TABLE_RECEIVE_CREATE);
} @Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists sendtable");
db.execSQL("drop table if exists receivetable");
onCreate(db);
} public static void DBwriter(Context context,String data){
DataBaseHelper sendDBhelper = new DataBaseHelper(context,"send.db",null,1);
SQLiteDatabase db =sendDBhelper.getReadableDatabase();
ContentValues cv = new ContentValues();
cv.put("msg",data);
db.insert("sendtable",null,cv);
db.close();
} public static List<String> DBreader(Context context){
List<String> dataread = new ArrayList<String>();
DataBaseHelper sendDBhelper = new DataBaseHelper(context,"send.db",null,1);
SQLiteDatabase db =sendDBhelper.getReadableDatabase();
Cursor cursor = null;
cursor = db.query("sendtable",new String[]{"msg"},null,null,null,null,null);
while (cursor.moveToNext()){
dataread.add(cursor.getString(cursor.getColumnIndex("msg")));
}
if (cursor != null){
cursor.close();
}
return dataread;
}
}接下来是我的Service类public class UdpService extends Service { DataBaseHelper dataBaseHelper = new DataBaseHelper(this,"send.db");
SQLiteDatabase db = dataBaseHelper.getReadableDatabase(); int sendPort = 5005;
int receivePort = 5005; UdpRelay.PacketReceivedListener listener = new UdpRelay.PacketReceivedListener() {
@Override
public void onReceive(MyPacket packet) {
ContentValues cv = new ContentValues();
cv.put("msg",packet.getMessage());
cv.put("priority",packet.getPrioriry());
cv.put("srcId",packet.getSrcId());
cv.put("destId",packet.getDestId());
cv.put("time",packet.getTime());
cv.put("location",packet.getLocation());
//db.insert("receivetable",null,cv);
}
}; UdpRelay relay = new UdpRelay(sendPort, receivePort, listener);
/**
* 绑定服务时才会调用
* 必须要实现的方法
*/
@Nullable
@Override
public IBinder onBind(Intent intent){
return null;
} /**
* 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
* 如果服务已在运行,则不会调用此方法。该方法只被调用一次
*/
@Override
public void onCreate() {
super.onCreate();
Log.d("myservicecreate","create");
} /**
* 每次通过startService()方法启动Service时都会被回调。
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("myservicestart","start");
relay.start();
return super.onStartCommand(intent, flags, startId);
} /**
* 服务销毁时的回调
*/
@Override
public void onDestroy() {
//db.close();
super.onDestroy();
}
}
MainActiviy中关于启动Service的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main); //启动Service
Intent myudpservice = new Intent(this,UdpService.class);
startService(myudpservice);希望各位大神指点迷津,感激不尽
解决方案 »
- Android launcher的图标移动实现原理
- 模拟器死掉
- 如何调试跟踪stagefright的源代码?
- 如何使用ListView显示表中的数据?
- Android button事件监听
- 创建Widget时的内存泄漏问题
- 找android的触屏版俄罗斯方块游戏源码
- 有root权限,如何实现后台服务监控所有按键事件
- EditText的监听事件addTextChangedListener(new TextWatcher())
- WebView 如何在加载的时候显示整个页面?
- 求助,关于MySurfaceView屏幕尺寸与Bitmap图尺寸的问题。
- 安卓 闹钟在Android 6.0以上无法正常运行
DataBaseHelper dataBaseHelper = new DataBaseHelper(this,"send.db");
SQLiteDatabase db = dataBaseHelper.getReadableDatabase();
DataBaseHelper dataBaseHelper = new DataBaseHelper(this,"send.db");
SQLiteDatabase db = dataBaseHelper.getReadableDatabase();
放到Service的onCreate()里就行了