페이지

레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시

2010년 10월 26일 화요일

안드로이드 SQLite3 query를 통한 Cusor 사용시 이상한 문제

일반적으로 안드로이드에서 SQLite3 DB를 이용하여 여러 Row의 데이터를 읽을때
아래처럼 코딩을 주로 한다.
    int rowCnt = 0;
  String strWhere = " keyIdx= ?";
  String args[] = {"keyValue"};
  String getColumns[] = {"a", "b", "c"};

  Cursor cus = sdb.query(MY_TABLE_NAME, getColumns, strWhere, args, null, null, "cal_day, cal_degree desc");

  try{
   rowCnt = cus.getCount();
   if(rowCnt > 0){
    int i = 0;
 
    cus.moveToFirst();
    data = null;
    data = new testData[cus.getCount()];
 
    int a = cus.getColumnIndex("a");
    int b = cus.getColumnIndex("b");
    int c = cus.getColumnIndex("c");
    do{
     try{
      data[i] = new testData();
   
      data[i].setA(cus.getString(a));
      data[i].setB(cus.getInt(b));
      data[i].setC(cus.getInt(c));
   
     }catch(Exception e){
      e.printStackTrace();
     }
     i++;
    }while(cus.moveToNext());


그러나 불행히도 이렇게 하니 자꾸만 아래와 같은 에러가 난다.
ERROR/CursorWindow(275): Bad request for field slot 0,-1. numRows = 2, numColumns = 3
물론 위의 에러 중 numRows는 데이터 Row가 2개라는 거니 맞고 numcolumns 또한 세개를 가져오라는 거니 맞다 단  Bad request for field slot 0,-1. <-- 요게 문제다..
아무리 해도 데이터를 제대로 가져오지 못해서 결국 아래와 같이 바꿨더니 해결되었다.
아래의 빨간색 글을 확인해보자

  int rowCnt = 0;
  String strWhere = " keyIdx= ?";
  String args[] = {"keyValue"};
  String getColumns[] = {"a", "b", "c"};


  Cursor cus = sdb.query(MY_TABLE_NAME, getColumns, strWhere, args, null, null, "cal_day, cal_degree desc");


  try{
   rowCnt = cus.getCount();
   if(rowCnt > 0){
    int i = 0;
   
    cus.moveToFirst();
    data = null;
    data = new testData[cus.getCount()];
   
    int idx = 0;//cus.getColumnIndex("a");
    int yea = 1;//cus.getColumnIndex("b");
    int mon = 2;//cus.getColumnIndex("c");
 


   do{
     try{
      data[i] = new testData();
     
      data[i].setA(cus.getString(a));
      data[i].setB(cus.getInt(b));
      data[i].setC(cus.getInt(c));
     
     }catch(Exception e){
      e.printStackTrace();
     }
     i++;
    }while(cus.moveToNext());

저렇게 무식하게 해야만 해결하는 걸까..
아직 서핑실력의 부족 & 영문독해실력 부족으로 여기까지밖에 해결책을 찾지 못했다 ㅠㅠ

안드로이드 BaseAdapter를 구현(implement)한 객체에서의 Intent 사용 중 문제해결

어제 말한대로 오늘 달력에 일정을 저장할 수 있도록 작업을 해보았다.
그러나 커다란 문제(사실 잘 몰라서 생긴)에 봉착하고 이를 해결하기 위해 열심히 서핑을 했다

애초부터 Activity객체 자체에서 BaseAdapter를 Implement했으면 문제가 발생하지 않았겠지만
이왕하는거 BaseAdapter를 Implement하는 객체를 생성 작업하기로 한게 문제였다.

일반적인 상황에선 문제가 안되지만
BaseAdapter를 구현한 객체에서 Intent를 생성하려니 그 방법을 알 수가 없었다.

그러다 어찌어찌 서핑을 통해 가능하다는건 알았지만 구체적인 해결방법을 명확하게
제시한 곳을 못찾다가 겨우 겨우 해결할 수 있었다.

그 소스를 잠시 소개하자만

@@ xxx.java <-- Activity 객체
     ... 중간 생략
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

       testAdapter test = new testAdapter(this);
      test.xxxMethodCall();
}

@@testAdapter.java <-- BaseAdapter를 구현한 객체
  private Context  cont;
  public testAdapter(Context mContext){
     cont = mContext;
  }
    .... 중간 생략
  private void xxxMethod(){
      Intent intent = new Intent(cont, newJava.class);
      mContext.startActivity(intent); // 그냥 컨텍스트 받은 넘으로 바로 처리한다.
 }

위 처럼 빨간 줄만 잘 하면 문제가 없다. 저리 쉬운걸 ㅠㅠㅠ
역시 제대로 배우려면 책 한권 사는것 뿐만아니라 학원도 가고 그래야 하는데.

그저 서핑으로만 하려니 조끔 힘들다..

2010년 10월 25일 월요일

안드로이드 재미삼아 만드는 달력

오늘도 칼퇴근 후 뒤적뒤적 서핑하며 달력을 만들어 보았다.
내일은 여기에 일정을 넣어봐야쥐 ^^

2010년 10월 24일 일요일

2010년 10월 23일 토요일

안드로이드 android:style/Theme.Dialog 테마로 띄운 창에 데이터 주고 받기

다이얼로그 테마로 띄운 창에 데이터 넘겨주기
아래의 빨간색이 테마창에 데이터를 넘기는 방법이다.
@@ java
   Intent intent = new Intent(testMain.this,DialogText.class);
   intent.putExtra("index", 1);
   intent.putExtra("name", "test");
   intent.putExtra("isTest", true);
  
   startActivityForResult(intent, 1); // Sub_Activity 호출

그럼 새로 띄운 테마에서 받을때는 어떻게 하는지 보자
마찬가지로 아래의 빨간글을 참고하면 된다.
@@java
        Intent intent = getIntent(); // 이 액티비티를 시작하게 한 인텐트를 호출
        int idx = intent.getIntExtra("index", 0); // 값을 안넘겼을 경우 디폴트 0으로 받음.
        String name = intent.getIntExtra("name");

        boolean test = intent.getIntExtra("isTest", false);

그렇다면 새로 띄운 테마에서 다시 데이터를 보내고 받을때는 어떻게 할까?
테마를 띄울때나 받을때나 똑같이 하면된다.

단 띄운 테마로부터 데이터를 받을때는
아래의 메소드를 반드시 오버라이드해서 처리해야한다.
@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data){
  super.onActivityResult(requestCode, resultCode, data);

// 액티비티가 정상적으로 종료되었을 경우
  if(resultCode==RESULT_OK){   
   if(requestCode==1){   
    // 받아온 값을 처리한다.
    String whatIntent = data.getStringExtra("whatIntent"); // 여기서 데이터 받는다

안드로이드 CompoundButton.OnCheckedChangeListener 구현시

체크박스 구현 예제가 대부분 단일 체크박스에 대한 부분만 있어서
두개 이상의 체크박스를 구현할 때 리스너 처리를 아래와 같이 xml에서 체크박스에 tag를 지정하여 처리한다

@@ xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:orientation="vertical">
   <TableLayout android:id="@+id/TableLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content">
    <TableRow>
   <TextView android:id="@+id/sound_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="220dip" android:text="@string/sound_msg"></TextView>
   <CheckBox android:id="@+id/sound_check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes_msg" android:tag="77"></CheckBox>
  </TableRow>
  <TableRow>
   <TextView android:id="@+id/init_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/init_msg"></TextView>
   <CheckBox android:id="@+id/init_check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes_msg" android:tag="33"></CheckBox>
  </TableRow>
 </TableLayout>
</LinearLayout>

@@java
public class checkBoxTest extends Activity implements CompoundButton.OnCheckedChangeListener {
    CheckBox initBox;
    CheckBox soundBox;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.option);
            
        initBox = (CheckBox)findViewById(R.id.init_check);
        initBox.setOnCheckedChangeListener(this);
    }
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   
     String targetBtn = (String)buttonView.getTag();
   
     if(targetBtn.equals("33")){ // 초기화 박스 클릭 시

         if (isChecked) {
          //do something        
         }
     }else{ // 사운드 박스 클릭 시
            //do something
     }
    }