마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

브로드캐스트에서는 DB가 사용 불가능한가요 ?

0 추천

에러 사진입니다. 

지금 로고켓이 나오다안나오다해서 같은 에러를 찾아 찍어올립니다.

http://stackoverflow.com/questions/6877555/access-a-database-from-broadcast-reciever

 

public class Alarm_BootReceiver extends BroadcastReceiver {
	static final String ACTION = "android.intent.action.BOOT_COMPLETED";

	private DB_DataBase_Helper DBHelper;
	private Cursor DBCursor;

	int getAlarm_id;
	int timeSECOND;
	int DB_time_h;
	int DB_time_m;

	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(ACTION)) {

			for (int i = 1; i < DBCursor.getCount() + 1; i++) {
				DB_time_h = Integer.parseInt(DBHelper.getColumn(i).getString(
						DBCursor.getColumnIndex("time_h")));
				DB_time_m = Integer.parseInt(DBHelper.getColumn(i).getString(
						DBCursor.getColumnIndex("time_m")));
				getAlarm_id = Integer.parseInt(DBHelper.getColumn(i).getString(
						DBCursor.getColumnIndex("alarm_id")));
				setAlarm(context, getAlarm_id);
			}
		}
	}

	private void setAlarm(Context context, int req) {
		AlarmManager alarmManager = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);

		Intent Intent = new Intent(context, Alarm_event.class);
		PendingIntent pIntent = PendingIntent.getActivity(context, req, Intent,
				0);

		alarmManager
				.setRepeating(
						AlarmManager.RTC_WAKEUP,
						((System.currentTimeMillis() + getDateTimeDiffer()) - (timeSECOND * 1000)),
						86400 * 1000, pIntent);
		Toast.makeText(context, req + "시작", Toast.LENGTH_LONG).show();

	}

	// 현재 시간과 알람 설정 시간의 시간 차이를 반환 (알람 시작을 위해 사용)
	public long getDateTimeDiffer() {
		long difference = 0;
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();

		Calendar calendar = Calendar.getInstance();
		Date date = calendar.getTime();
		String HHmm = new SimpleDateFormat("MMddHHmmss").format(date);

		int timeHOUR = Integer.parseInt(HHmm.substring(4, 6));
		int timeMINUTE = Integer.parseInt(HHmm.substring(6, 8));
		timeSECOND = Integer.parseInt(HHmm.substring(8, 10));

		// 현재시간
		time1.set(Calendar.HOUR_OF_DAY, timeHOUR);
		time1.set(Calendar.MINUTE, timeMINUTE);

		// 예약시간
		time2.set(Calendar.HOUR_OF_DAY, DB_time_h);
		time2.set(Calendar.MINUTE, DB_time_m);

		// 현재시간 time1과 예약시간 time2의 간격 계산
		if (time1.getTimeInMillis() > time2.getTimeInMillis()) {
			difference = ((86400 * 1000) - (Math.abs(time2.getTimeInMillis()
					- time1.getTimeInMillis())));
		} else if (time1.getTimeInMillis() < time2.getTimeInMillis()) {
			difference = Math.abs(time2.getTimeInMillis()
					- time1.getTimeInMillis());
		} else if (time1.getTimeInMillis() == time2.getTimeInMillis()) {
			difference = 86400 * 1000;
		}

		return difference;
	}
}

 

안녕하세요. 안드로이드 입문자입니다.

지금 알람을 구현중입니다. 이제 마지막으로 폰은 재부팅시에 브로드캐스트에서 BOOT_COMPLETED 액션을 받아

DB의 값을 이용해서 다시 알람매니저에 등록하는 일만 남았습니다. 

 

테스트를 위해 DB와 관련된 부분은 주석하고 테스트하니 다른 부분은 다 잘되는군요.

그리고 DB 소스가 잘못됬나 일반 엑티비티클래스 생성해서 테스트해보니까 원하는 대로 잘됩니다.

브로드캐스트와 DB의 연동에 관한 문재라고 생각됩니다.

선배님들은 어떻게 생각하시는지 조언 부탁드립니다.

Hui (590 포인트) 님이 2013년 3월 3일 질문
Hui님이 2013년 3월 3일 수정

2개의 답변

0 추천
NullPointException 인데 DB 사용 유무가 아닌 단순한 코드 실수네요.

 

본인이 작성한 코드를 다시 검토해보세요.
익명사용자 님이 2013년 3월 3일 답변
브로드캐스트 말고 일반 엑티비티클래스에서 같은 소스로 하면 정상적으로 작동됩니다.  NullPointerException가 인자값으로 Null을 넣어서 나는 예외로 알고있습니다.

지금 DB에서 값을 가저와 쓰는 부분에서만 NullPointerException 예외가 나옵니다. 그래서 브로드캐스트에서는 DB 값을 불러올 수 없는지 조언을 듣고자한것 입니다.

아니면 브로드캐스트에서는 엑티비티클래스와 다른 방법으로 호출해야하는지 조언 부탁드립니다.
브로드캐스트리시버에서 DB 접근 됩니다.
다시 말씀드리지만 NullPoint 에러는 본인의 비지니스 로직이 잘못 된 것이니 다시 확인해보시기 바랍니다.
0 추천
브로드캐스트리시버에서 db구현 가능합니다...

10초만 안넘기시면 될거에요

근데 하나 조언드리자면... 저 코드에서 DBHelper하고 DBCursor은 정상이 아닙니다...

저게 클래스 변수인듯한데 초기화도 안됫구요...

static이라면 어디선가 context를 넘겨주셔야하는데 그게 없네요..
수상한i (8,050 포인트) 님이 2013년 3월 3일 답변
브로드캐스트 전체 소스올립니다..
아무리 봐도 이해가 가지 않습니다. 잘못된 부분 지적 부탁드립니다.
private DB_DataBase_Helper DBHelper;
private Cursor DBCursor;

이 2개의 변수가 초기화되지 않았습니다
즉,  저 2개 값은 null이라는 거죠 nullpointerexception은 null인자에 의해서 발생되는 경우도 있지만...그건 간접적으로 나는 에러고요..
발생이유는 null.함수 입니다

먼저 초기화 하시면 해결될거에요^^
(저는 초기화 블록을 모르는관계로 ㅎ)
...