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

디비파일을 불러올려고 합니다.

0 추천

 

저의 저장된 디비파일입니다. flag라는 필드에 0,1로 구분하여

서로 다른 곳에서 저장된 데이터라는 걸 구분하였습니다.

질문을 드리코자 하는 것은,..

이제 이 디비파일을 가지고 그래프를 그릴려고 하는데요.

flag=0 인 DB파일 그래프만 그려야 하고,

flag=1인 DB파일 그래프만 그려야 합니다.

 

아래 소스 5번줄을 어케 고쳐야 하는지요?????????

현재소스처럼 하니간 null 포인터 오류 나더라구요~

 

아니면 다르게 접근을 해야하는건가요?  ㅠㅠ

 

@Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  
  MpmDto dto = new MpmDto(); 
  
  switch(v.getId()){
  case R.id.graphbtn :
   Toast.makeText(LineGraph.this, "Smartphone data graph", Toast.LENGTH_SHORT).show();
   
   
      if(dto.flag.equals("0")) {
       
       //XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    dataset.addSeries(series);
       //dataset.addSeries(series2);
    
    //XYSeriesRenderer renderer = new XYSeriesRenderer();  // 그래프 선 설정
    renderer.setColor(Color.CYAN);
    renderer.setPointStyle(PointStyle.CIRCLE);
    renderer.setFillPoints(true);  // fill in the points with the color selected 
    renderer.setLineWidth(2);
    renderer.setDisplayChartValues(true); // 그래프상에 수치 표시여부 확인
    renderer.setChartValuesTextSize(10);
    renderer.setChartValuesSpacing(8);  // pointstyle로부터의 거리를 계산
       renderer.setChartValuesTextAlign(Align.RIGHT);  // 실제로 보이는 위치와 반대이다.
      
    //XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); // 그래프 자체 설정
    mRenderer.addSeriesRenderer(renderer);
       //mRenderer.addSeriesRenderer(renderer2);
    
    mRenderer.setChartTitle("Optical Power Graph");
    mRenderer.setXTitle("OPTICAL");
    mRenderer.setLabelsTextSize(15);
    mRenderer.setYTitle("POWER");
    mRenderer.setZoomButtonsVisible(true); //

.................중략

MpmDto 소스가 뭔지 궁금하실것 같아서  다음과 같습니다.

 

public class MpmDto implements Parcelable {
 public int id;
 public String date;
 public String time;
 public String power;
 public String address;
 public String wave;
 public String place;
 public String name;
 public String memo;
 public String powerUnit;
 public String flag;
 public String il;
 public boolean isDelete;
 
 public MpmDto() {
 }

public MpmDto(Parcel in) {
  readFromParcel(in);
 }

@Override
 public void writeToParcel(Parcel dest, int flags) {
  dest.writeInt(id);
  dest.writeString(date);
  dest.writeString(time);
  dest.writeString(power);
  dest.writeString(address);
  dest.writeString(wave);
  dest.writeString(place);
  dest.writeString(name);
  dest.writeString(memo);
  dest.writeString(powerUnit);
  dest.writeString(flag);
  dest.writeString(il);
 }

private void readFromParcel(Parcel in) {
  id = in.readInt();
  date = in.readString();
  time = in.readString();
  power = in.readString();
  address = in.readString();
  wave = in.readString();
  place = in.readString();
  name = in.readString();
  memo = in.readString();
  powerUnit = in.readString();
  flag = in.readString();
  il = in.readString();
 }

 @Override
 public int describeContents() {
  return 0;
 }

public static final Parcelable.Creator<MpmDto> CREATOR = new Parcelable.Creator<MpmDto>() {

 @Override
  public MpmDto createFromParcel(Parcel in) {
   return new MpmDto(in);
  } 

@Override
  public MpmDto[] newArray(int size) {
   return new MpmDto[size];
  }
 };
}

 

 

앤드류이드 (6,190 포인트) 님이 2013년 8월 1일 질문
앤드류이드님이 2013년 8월 1일 수정

2개의 답변

0 추천
 
채택된 답변

#. 일단 LineGraph의 onClick 부분만 좀 뜯어 고쳐 봤습니다. 기존의 if문을 SQL의 WHERE절로 바꿨습니다.

#. 나머지 case부분은 둘 다 같은 내용 같아 보여서 그냥 합체.

#. 스레드의 반복문은 i, j, m 중복 같아 보여서 ...

#. 좀 더 하자면, db읽는 작업을 스레드 안쪽으로 옮겨서, array[]를 없애고 직접 XArray, YArray로 할당하는 게 더 좋을 듯.

#. 데이터가 없어서 그래프는 못그려보겠네요.

@Override
	public void onClick(View v) {
		
		String qry;
		switch (v.getId()) {
			case R.id.mpmgraph:
				Toast.makeText(LineGraph.this, "mpm data graph", Toast.LENGTH_SHORT).show();
				qry = "SELECT _id, wave, power, date, time, address, place, name, memo, power_unit, flag, il "
						+ "FROM KSJV2 WHERE flag='" + 1 + "';";
				break;
			case R.id.graphbtn:
			default:
				Toast.makeText(LineGraph.this, "Smartphone data graph", Toast.LENGTH_SHORT).show();
				qry = "SELECT _id, wave, power, date, time, address, place, name, memo, power_unit, flag, il "
						+ "FROM KSJV2 WHERE flag='" + 0 + "';";
				break;

		}
		
		DataBaseManager db = new DataBaseManager(LineGraph.this);
		SQLiteDatabase sql = db.getReadableDatabase();
		Cursor c = sql.rawQuery(qry, null);
		
		Toast.makeText(LineGraph.this, "DATA Count : " + c.getCount(), Toast.LENGTH_SHORT).show();

		final String[] array = new String[c.getCount()]; // row길이로 배열 생성.
		int k = 0;
		while (c.moveToNext()) {
			array[k] = c.getString(2);
			if (array[k].equals("---.--")) {
				array[k] = "-13.25";
			} else {
				array[k] = c.getString(2);
			}
			k++;
		}

		
		LinearLayout llbody = (LinearLayout) findViewById(R.id.llbody);

		dataset.addSeries(series);
		mRenderer.addSeriesRenderer(renderer);
		mRenderer.setChartTitle("Optical Power Graph");
		mRenderer.setXTitle("OPTICAL");
		mRenderer.setLabelsTextSize(15);
		mRenderer.setYTitle("POWER");
		mRenderer.setZoomButtonsVisible(true); // 줌 기능 표시 여부 결정
		mRenderer.setShowGrid(true);
		mRenderer.setPointSize(3f);
		mRenderer.setApplyBackgroundColor(true);
		mRenderer.setBackgroundColor(Color.BLACK); // mRenderer.setApplyBackgroundColor(true);를 해줘야 컬러가 적용된다.
		mRenderer.setMarginsColor(Color.BLACK);
		mRenderer.setXLabels(10);
		mRenderer.setYLabels(10);
		mRenderer.setLabelsTextSize(20);
		mRenderer.setYLabelsAlign(Align.CENTER);
		mRenderer.setShowLegend(true);
		mRenderer.setLegendTextSize(15); // 맨 하단 그래프 이름 사이즈 결정

		gv = ChartFactory.getLineChartView(this, dataset, mRenderer);
		llbody.addView(gv);
		
		new Thread() {
			public void run()
			{

					try {
						Thread.sleep(300);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

					int[] Xarray = new int[array.length];
					float[] Yarray = new float[array.length];
					for (int j = 0; j < array.length; j++) { // ??
						Xarray[j] = j;
						Yarray[j] = Float.parseFloat(array[j]);
						series.add(Xarray[j], Yarray[j]);
					}

					
					gv.repaint();
				
			}
		}.start();


	}

#. MainActivity의 onScroll은 스크롤 시작시 뿐만 아니라, 스크롤 되는 도중에도 계속 이벤트가 발생합니다.

 

 

Elex (9,090 포인트) 님이 2013년 8월 1일 답변
앤드류이드님이 2013년 8월 2일 채택됨
고마워요..전철 막차시간때문에 테스트는 못해봤네요. 내일 아침 출근하자마자 삽입해볼께요.^^ 아참 그리고 스크롤에 대해서 설명해주셔서 감사드려요.. 스크롤했다가 이상해서 플링으로 고쳤거든여.. 왜 그런지 진짜 궁금했었는데 좀 풀렸네요. 스크롤하니깐 온크레이트가 3번씩 발생하더라구요 ㅋㅋ
0 추천
MpmDto 클래스만 생성하고 그 생성자에서는 아무 처리도 안했으니, 해당 인스턴스의 필드값은 모두 null인 상태죠.

그 상태에서 dto.flag라는 필드에 접근했으니 null 예외 발생!
Elex (9,090 포인트) 님이 2013년 8월 1일 답변
그러면 어케 접근해야 하나요?? 진짜 안드로이드의 길은 참으로 멀고 험담하네요. 저번에도 도와주셨는데 한번만 더 부탁드려요.
전체 프로그램을 못봐서 자세히는 말씀 못 드리겠고, 두번째 생성자가 정상적으로 작동한다면 5번줄을 MpmDto dto = new MpmDto(parcel);
안되용.. 지금 이클립스 가능하시면 잠깐 봐주실수 있으신지요? Elex님 이라면 한 5분이면 해결할것 같은데요. 메일로 프로젝트 파일 보내드릴께요.
제 메일 아세요? 지금 밥하는 중이라 바로 확인은 못하겠고, 좀 늦어도 상관없으시다면..
10시 반 까지 대기 탈 수 있습니다. 어차피 야근 중이라서요 ㅋ  밥 하시고 천천히 드시고 오셔도 충분합니다. 기다릴수 있어욧..메일은 댓글로 남겨주시면 감사드리겠습니다.
...